Si sudo ejecuta un archivo de script Bash, ¿todos los comandos dentro del script Bash también se ejecutarán como sudo?

30

Quiero escribir un script automatizado posterior a la instalación en Bash (llamado post-install.sh, por ejemplo). El script agregará y actualizará automáticamente repositorios, instalará y actualizará paquetes, editará archivos de configuración, etc.

Ahora, si ejecuto este script, por ejemplo con sudo post-install.sh, ¿solo se me pedirá una sudocontraseña una vez, o tendré que ingresar la sudocontraseña en cada invocación de un comando dentro del script, que necesita sudopermiso? En otras palabras, ¿los comandos dentro del script bash 'heredan' los permisos de ejecución, por así decirlo?

Y, si lo hacen , ¿existe la posibilidad de que los sudopermisos expiren (si, por ejemplo, un comando en particular demora lo suficiente como para exceder el sudotiempo de espera)? ¿O la sudoentrada de contraseña inicial durará la duración completa de todo el script?

Dabbler decente
fuente
44
Puede interesarle ver algunas herramientas diseñadas específicamente para esta tarea. 3 comunes son: títeres, chef y ancible.
Spuder
@spuder, y para una arquitectura de nivel empresarial de mayor escala y la seguridad de su administración de configuración, puede usar CFEngine 3. (No para los débiles de corazón, ni para comandos únicos).
Comodín

Respuestas:

38

P # 1: ¿Solo se me pedirá una contraseña de sudo una vez, o tendré que ingresar la contraseña de sudo en cada invocación de un comando dentro del script, que necesita permiso de sudo?

Sí, una vez, durante la ejecución de su script.

NOTA: cuando proporciona credenciales sudo, la autenticación suele ser válida durante 5 minutos dentro del shell donde escribió la contraseña. Además, cualquier proceso hijo que se ejecute desde este shell, o cualquier script que se ejecute en el shell (su caso) también se ejecutará en el nivel elevado.

P # 2: ¿todavía existe la posibilidad de que los permisos de sudo expiren (si, por ejemplo, un comando en particular tarda lo suficiente como para exceder el tiempo de espera de sudo)? ¿O la entrada inicial de la contraseña de sudo durará la duración completa de todo el script?

No, no agotarán el tiempo de espera dentro del script. Solo si los estaba escribiendo interactivamente dentro del shell donde se proporcionaron las credenciales. Cada vez que sudose ejecuta dentro de este shell, se restablece el tiempo de espera. Pero en su caso, las credenciales permanecerán mientras el script ejecute y ejecute comandos desde dentro.

extracto de la página de manual de sudo

Este límite es específico de la política; el tiempo de espera predeterminado para la solicitud de contraseña para la política de seguridad de sudoers es de 5 minutos.

slm
fuente
1
La respuesta a la Q1 es "No, no se le volverá a preguntar".
dannysauer
@dannysauer: lee su Q nuevamente. ¡Estoy diciendo Sí a que se me solicite la contraseña solo una vez!
slm
La pregunta dice "es aob", y solo decir "sí" no dejó en claro si era "sí, a" o "sí, b". Solo trato de aclarar las cosas para futuros lectores. : D
dannysauer
@dannysauer - ver actualización.
slm
1
Esta nueva pregunta sería esta: stackoverflow.com/questions/3522341/… . sudo -u $(logname) <command>Deberia trabajar.
Gauthier
17

bashy todos sus procesos secundarios se ejecutarán con permisos de superusuario. Por lo tanto, no necesitará volver a ingresar una contraseña para los comandos en su script bash.

El sudotiempo de espera solo se aplica a (más tarde) la invocación por separado de sudo. No afectaría su proceso bash que ya se está ejecutando, ni a ninguno de sus descendientes.

Laurence Gonsalves
fuente
3

Estas respuestas son probablemente todas correctas. Sin embargo, esta no es la forma de uso general (hasta donde yo sé) para crear secuencias de comandos bash que requieren sudopermisos. En general, en la parte superior del script, asume que no se ha ejecutado con sudopermisos y, en su lugar, se llama a sudo -vsí mismo (lo que le pedirá al usuario su contraseña) para 'configurar' una sudo'sesión'. Puede escribir echoun texto explicativo antes de la solicitud, o anular sudola propia solicitud con el -pinterruptor, para informarle al usuario que necesita sudoacceso a algunos comandos.

Luego, en su secuencia de comandos, debería estar bien para invocar sudolos comandos que lo requieren (y solo aquellos comandos que lo requieren) sin más solicitudes de contraseña. Si cree que un determinado grupo de comandos que se ejecutan juntos en su script (independientemente de su propio uso de sudo) se extenderá más allá del tiempo de espera de sudo, puede llamar sudo -val medio para emitir una especie de 'mantener viva' la sudo'sesión '.

Si la sudo'sesión' caduca durante el script, simplemente se le pedirá al usuario su contraseña la próxima vez que emita un comando sudo en el script.

alexrussell
fuente
1
Digamos que uno de los pasos de la secuencia de comandos es construir un kernel de Linux completamente nuevo, que puede tomar unas dos horas. Mantener viva la sesión podría ser un desafío, ¿cómo lidiaste con eso?
Gauthier
No puedes Pero la próxima vez que llame sudo -v, le pedirá al usuario su contraseña nuevamente. No es el peor problema en mi opinión. Quizás sea útil, hacer que el usuario conozca el mecanismo podría ser útil.
alexrussell
Lo contrario de esto es exigir al usuario que llame al script con sudo según las otras respuestas, y luego sudo -u $SUDO_USERhacer que todos los comandos que no requieren root se ejecuten sin elevar. Lamentablemente, agrega más código, pero es la única forma confiable de realizar tareas de raíz en un proceso de larga ejecución.
dragon788
Supongo que debería aclarar, otra forma de hacerlo sería llamar a sudo una vez al comienzo del script para /etc/sudoers.dusar un archivo temporal visudo -c -f /tmp/tempsudoerspara asegurarse de que el archivo sea válido antes de copiarlo en su lugar, y luego eliminar ese archivo una vez hecho (utilizando una trampa en la salida / error para garantizar que no se pueda abusar de la escalada). La implementación más segura y segura solo le permitiría a su usuario ejecutar los comandos específicos en su secuencia de comandos con argumentos específicos sin una contraseña mediante el NOPASSWDalmacenamiento de cada comando / argumentos en una matriz para construir el archivo.
dragon788
Un poco tarde volviendo a @Gauthier aquí, pero parece que me equivoqué cuando dije que no puedes mantener sudoviva una sesión si una tarea determinada lleva más tiempo que el tiempo de espera. Encontré esta técnica el otro día en el repositorio de archivos de puntos de Mathias Bynens: while true; do sudo -n true; sleep 60; kill -0 "$$" || exit; done 2>/dev/null &- github.com/mathiasbynens/dotfiles/blob/master/.macos#L13
alexrussell