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?
fuente
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?
El problema es que sudo -s
sin ningún argumento se abrirá un shell interactivo para root.
Si solo quieres ejecutar un solo comando usando sudo -s
, puedes hacer lo siguiente:
sudo -s command
Por ejemplo :
$ sudo -s whoami
root
O puede usar aquí cadenas:
$ sudo -s <<<'whoami'
root
Si tiene varios comandos, puede usar aquí doc:
$ sudo -s <<'EOF'
> whoami
> hostname
> EOF
root
something--
Otra forma sería pasar un comando (s) completo de bash a sudo
:
#!/bin/bash
sudo bash -c 'command1; command2; command3;'
Sin embargo, una mejor manera sería iniciar el script con sudo
. No es una muy buena idea tener sudo
dentro del guión. Mucho mejor ejecutar todo el script con privilegios de root ( sudo script.sh
). Si es necesario, puede usar sudo
para soltar privilegios para comandos específicos. Por ejemplo:
#!/usr/bin/env bash
whoami
echo $HOME
sudo -u terdon whoami ## drop privileges for specific command.
Ejecutar el script anterior devuelve:
$ sudo ~/scripts/a.sh
root
/root
terdon
El shell Bourne tiene una -c
bandera que puede usar para pasar un script arbitrario al shell, para que pueda escribir algo como
sudo sh -c 'something'
Sin 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ón prepare_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:
prepare_something_script()
{
cat <<EOF
something
EOF
}
El script producido por prepare_something_script
puede ejecutarse localmente con los privilegios otorgados por sudo de la siguiente manera:
prepare_something_script | sudo sh
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:
something64=$(prepare_something_script | base64)
ssh usesr@remote-host "echo ${something64} | base64 --decode | sudo sh"
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.
Debe agregar el comando antes de sudo -s, en lugar de en la siguiente línea.
sudo -s something...
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.