Estoy tratando de hacer un script como este:
#!/bin/bash
sudo -s
something...
Cuando lo ejecuto, obtengo un nuevo shell pero something
se ejecuta solo cuando salgo del shell creado por sudo -s
, no dentro de él.
¿Alguna ayuda?
shell-script
sudo
Matteo
fuente
fuente
sudo -s
solo en caso de que elroot
usuario tenga la idea (bastante pobre) de cambiar su shell. Esto debería ser realmente losudo sh
que establece explícitamente qué shell se va a utilizar.Otra forma sería pasar un comando (s) completo de bash a
sudo
:Sin embargo, una mejor manera sería iniciar el script con
sudo
. No es una muy buena idea tenersudo
dentro del guión. Mucho mejor ejecutar todo el script con privilegios de root (sudo script.sh
). Si es necesario, puede usarsudo
para soltar privilegios para comandos específicos. Por ejemplo:Ejecutar el script anterior devuelve:
fuente
El shell Bourne tiene una
-c
bandera que puede usar para pasar un script arbitrario al shell, para que pueda escribir algo comoSin embargo, esto solo es útil para los comandos más simples, porque es muy engorroso citar el script correctamente y el inconveniente es aún mayor si envía el comando a un servidor remoto a través de ssh porque el script de argumento se analizará dos veces, una vez al lado enviando el script y una vez al lado ejecutando el script.
Si
something
es un script complejo o necesita ser pasado por una línea ssh , es una práctica común escribir una funciónprepare_something_script
cuyo trabajo es escribir el script 'algo' en stdout . En su forma más simple, esta función puede usar un documento aquí para generar su salida:El script producido por
prepare_something_script
puede ejecutarse localmente con los privilegios otorgados por sudo de la siguiente manera:En el escenario donde el script debe ejecutarse de forma remota con los privilegios otorgados por sudo , es habitual codificar el script en la base 64 para evitar redirigir la entrada estándar de ssh , de esta manera:
Si usa ese código en una función, no olvide marcar la variable something64 como local . Algunas implementaciones de base64 ofrecen un
-d
indicador para decodificar, que es menos compatible que la--decode
variante detallada . Algunas implementaciones requieren agregar un-w 0
comando de codificación para evitar saltos de línea espurios.fuente
Debe agregar el comando antes de sudo -s, en lugar de en la siguiente línea.
fuente