I comandi in uno script vengono eseguiti uno per uno, indipendentemente. Lo script stesso come genitore di tutti i comandi nello script, è un altro processo indipendente e il comando su non lo fa e non può cambiarlo in root: il comando su crea un nuovo processo con i privilegi di root.
Al termine del comando su, il processo parent, sempre in esecuzione come lo stesso utente, eseguirà il resto dello script.
Quello che vuoi fare è scrivere uno script wrapper. I comandi con privilegi vanno nello script principale, ad esempio~/main.sh
#!/bin/sh
ls /root
Lo script wrapper chiama lo script principale con autorizzazioni di root, in questo modo
#!/bin/sh
su -c ~/main.sh root
Per avviare questo processo è necessario eseguire il wrapper, che a sua volta avvia lo script principale dopo il passaggio dell'utente all'utente root.
Questa tecnica wrapper può essere utilizzata per trasformare lo script in un wrapper attorno a se stesso. Fondamentalmente controlla se è in esecuzione come root, altrimenti usa "su" per riavviarlo.
$ 0 è un modo pratico per fare in modo che uno script faccia riferimento a se stesso e il comando whoami può dirci chi siamo (siamo root?)
Quindi diventa lo script principale con wrapper integrato
#!/bin/sh
[ `whoami` = root ] || exec su -c $0 root
ls /root
Nota l'uso di exec. Significa "sostituisci questo programma con", che termina effettivamente la sua esecuzione e avvia il nuovo programma, lanciato da su, con root, per essere eseguito dall'alto. L'istanza di sostituzione è "root", quindi non esegue il lato destro di ||
sudo su
mi fa male agli occhi.