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 sudo
contraseña una vez, o tendré que ingresar la sudo
contraseña en cada invocación de un comando dentro del script, que necesita sudo
permiso? 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 sudo
permisos expiren (si, por ejemplo, un comando en particular demora lo suficiente como para exceder el sudo
tiempo de espera)? ¿O la sudo
entrada de contraseña inicial durará la duración completa de todo el script?
fuente
Respuestas:
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.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
extracto de la página de manual de sudosudo
se 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.fuente
sudo -u $(logname) <command>
Deberia trabajar.bash
y 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
sudo
tiempo de espera solo se aplica a (más tarde) la invocación por separado desudo
. No afectaría su proceso bash que ya se está ejecutando, ni a ninguno de sus descendientes.fuente
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
sudo
permisos. En general, en la parte superior del script, asume que no se ha ejecutado consudo
permisos y, en su lugar, se llama asudo -v
sí mismo (lo que le pedirá al usuario su contraseña) para 'configurar' unasudo
'sesión'. Puede escribirecho
un texto explicativo antes de la solicitud, o anularsudo
la propia solicitud con el-p
interruptor, para informarle al usuario que necesitasudo
acceso a algunos comandos.Luego, en su secuencia de comandos, debería estar bien para invocar
sudo
los 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 desudo
) se extenderá más allá del tiempo de espera de sudo, puede llamarsudo -v
al medio para emitir una especie de 'mantener viva' lasudo
'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.fuente
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.sudo -u $SUDO_USER
hacer 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./etc/sudoers.d
usar un archivo temporalvisudo -c -f /tmp/tempsudoers
para 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 elNOPASSWD
almacenamiento de cada comando / argumentos en una matriz para construir el archivo.sudo
viva 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