Trabajar estrictamente dentro de un script (y no editar el archivo sudoers o llamar al script a través de sudo ./script.sh
), esto es lo que creo que es el método más limpio.
startsudo() {
sudo -v
(while true; do sudo -v; sleep 50; done;) &
SUDO_PID="$!"
trap stopsudo SIGINT SIGTERM
}
stopsudo() {
kill "$SUDO_PID"
trap - SIGINT SIGTERM
sudo -k
}
Básicamente, esto define un par de funciones para habilitar y deshabilitar el modo sudo. Llamando al startsudo
antes de ejecutar su código sudo-using se autentica con sudo, crea un bucle de sudo-refrescante de fondo, guarda el PID del bucle y establece una trampa de señal para detener el modo sudo cuando se presiona Ctrl + C. Llamar al stopsudo
elimina el bucle, borra la trampa de señal e invalida la autenticación anterior con sudo.
Después de copiar estas funciones en su secuencia de comandos, utilícelas de esta manera.
startsudo
echo "Sudo mode is active."
# whatever you want to do with sudo
stopsudo
Me gustaría dar las gracias @karl por la sencillez de inlining el bucle y @sehe sudo-refrescante para señalar que una trampa de la señal debe ser usado para matar el bucle si no se mata normalmente. Ambas ideas mejoraron my btrfs backup script, que usa un bucle sudo-refreshing para evitar volver a solicitar al usuario después de que la copia de seguridad de un subvolumen demora más que el tiempo de espera de sudo.
¿por qué no dejas que el usuario lo ejecute 'sudo'? – CharlesB