Solución:
Los comandos de un script se ejecutan uno por uno, de forma independiente. El script en sí, como padre de todos los comandos en el script, es otro proceso independiente y el comando su no lo hace ni puede cambiarlo a root: el comando su crea un nuevo proceso con privilegios de root.
Una vez que se completa el comando su, el proceso principal, que aún se ejecuta como el mismo usuario, ejecutará el resto del script.
Lo que quiere hacer es escribir un script de envoltura. Los comandos privilegiados van al script principal, por ejemplo ~/main.sh
#!/bin/sh
ls /root
El script de envoltura llama al script principal con permisos de root, como este
#!/bin/sh
su -c ~/main.sh root
Para iniciar este proceso, ejecuta el contenedor, que a su vez inicia el script principal después de cambiar de usuario al usuario root.
Esta técnica de envoltura se puede utilizar para convertir el script en una envoltura alrededor de sí mismo. Básicamente, verifique si se está ejecutando como root, si no, use “su” para reiniciarse.
$ 0 es una forma práctica de hacer que un script se refiera a sí mismo, y el comando whoami puede decirnos quiénes somos (¿somos root?)
Entonces, el script principal con contenedor incorporado se convierte en
#!/bin/sh
[ `whoami` = root ] || exec su -c $0 root
ls /root
Tenga en cuenta el uso de exec. Significa “reemplazar este programa por”, lo que efectivamente finaliza su ejecución e inicia el nuevo programa, lanzado por su, con root, para que se ejecute desde arriba. La instancia de reemplazo es “raíz”, por lo que no ejecuta el lado derecho de ||
Utilice lo siguiente en el script.
sudo su <<HERE
ls /root
HERE
El código entre el bloque HERE se ejecutará como root.
Sin más argumentos su
ejecutará el shell de inicio de sesión para root. Eso es lo que realmente hace la primera línea de su guión. Cuando sale, el shell de inicio de sesión se cierra, su regresa y su script continúa la ejecución, es decir, con la segunda línea: ls /root
. Creo que puedes simplemente sudo ls /root
para hacer lo que quieras.