Los comandos en un script se ejecutan uno por uno, independientemente. El Script en sí mismo como el padre de todos los comandos en el script, es otro proceso independiente y el comando su no lo cambia y no 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 padre, que todavía se ejecuta como el mismo usuario, ejecutará el resto del script.
Lo que quieres 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 envoltorio llama al script principal con permisos de root, como este
#!/bin/sh
su -c ~/main.sh root
Para iniciar este proceso, ejecuta el reiniciador, que a su vez inicia el script principal después de cambiar de usuario al usuario raíz.
Esta técnica de envoltura se puede usar para convertir el script en una envoltura a su alrededor. Básicamente, verifique si se está ejecutando como root, de lo contrario, 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 el 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", que efectivamente finaliza su ejecución e inicia el nuevo programa, lanzado por su, con root, para ejecutarse desde la parte superior. La instancia de reemplazo es "root", por lo que no ejecuta el lado derecho de ||
sudo su
me duelen los ojos