Un script de muestra puede ser el siguiente:
#!/bin/bash
sudo su
ls /root
Al usar ./test.sh
como usuario normal, en su lugar ejecuta ls
como superusuario y salir, cambia a root; y cuando salgo, ejecuta ls /root
como el usuario normal.
¿Alguien puede decirme sobre el mecanismo al respecto?
Respuesta aceptada:
Los comandos de un script se ejecutan uno a uno, de forma independiente. El Script en sí mismo, como padre de todos los comandos en el script, es otro proceso independiente y el comando su no lo cambia ni puede cambiarlo a root:el comando su crea un nuevo proceso con privilegios de root.
Después de que se complete el comando su, el proceso principal, aún ejecutándose como el mismo usuario, ejecutará el resto del script.
Lo que quieres hacer es escribir un script contenedor. Los comandos privilegiados van al script principal, por ejemplo ~/main.sh
#!/bin/sh
ls /root
El script contenedor llama al script principal con permisos de raíz, así
#!/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 raíz.
Esta técnica de envoltorio se puede utilizar para convertir el script en un envoltorio sobre sí mismo. Básicamente, verifique si se está ejecutando como root, si no, use "su" para volver a iniciarse.
$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 envoltorio 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 la raíz, para ejecutarse desde la parte superior. La instancia de reemplazo es "raíz", por lo que no ejecuta el lado derecho de ||