GNU/Linux >> Tutoriales Linux >  >> Linux

¿Por qué "sudo Su" en un script de Shell no ejecuta el resto del script como root?

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 ||


Linux
  1. ¿Cómo ejecutar un comando como administrador del sistema (raíz)?

  2. ¿Por qué necesita poner #!/bin/bash al comienzo de un archivo de script?

  3. Ejecute un script de shell desde el comando docker-compose, dentro del contenedor

  4. Kali Linux VM:Permiso denegado para ejecutar script de shell, como raíz

  5. Ejecute un script de shell como un usuario diferente

Cómo ejecutar el comando / secuencia de comandos de Linux Shell en segundo plano

Cómo ejecutar Shell Script como servicio SystemD en Linux

Manera de hacer que un script de Shell siempre se ejecute como raíz?

Linux:¿por qué el kernel no puede ejecutar Init?

Cómo ejecutar scripts de Python desde shell

Cómo crear y ejecutar un script de shell en Ubuntu 22.04