Uno script di esempio può essere il seguente:
#!/bin/bash
sudo su
ls /root
Quando si utilizza ./test.sh
come utente normale, esegui invece ls
come super utente ed esce, passa a root; e quando esco, esegue ls /root
come utente normale.
Qualcuno sa dirmi il meccanismo al riguardo?
Risposta accettata:
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 privilegi di root.
Al termine del comando su, il processo padre, ancora in esecuzione come lo stesso utente, eseguirà il resto dello script.
Quello che vuoi fare è scrivere uno script wrapper. I comandi privilegiati vanno nello script principale, ad esempio ~/main.sh
#!/bin/sh
ls /root
Lo script wrapper chiama lo script principale con i permessi di root, come questo
#!/bin/sh
su -c ~/main.sh root
Per avviare questo processo, esegui il wrapper, che a sua volta avvia lo script principale dopo aver cambiato utente all'utente root.
Questa tecnica di wrapper può essere utilizzata per trasformare lo script in un wrapper su se stesso. Fondamentalmente controlla se è in esecuzione come root, in caso contrario, usa "su" per riavviare se stesso.
$0 è un modo pratico per fare in modo che uno script si riferisca a se stesso e il comando whoami può dirci chi siamo (siamo root?)
Quindi lo script principale con il wrapper integrato diventa
#!/bin/sh
[ `whoami` = root ] || exec su -c $0 root
ls /root
Notare l'uso di exec. Significa "sostituisci questo programma con", che di fatto termina la sua esecuzione e avvia il nuovo programma, lanciato da su, con root, per essere eseguito dall'alto. L'istanza sostitutiva è "root", quindi non esegue il lato destro di ||