Puede configurar un bucle que se ejecuta en segundo plano para ejecutar periódicamente "sudo -v", el truco, por supuesto, es hacer que el bucle finalice limpiamente cuando finalice su script. Entonces tiene que haber algún tipo de comunicación entre los dos procesos; Los archivos tmp están bien para esto, y también se pueden limpiar fácilmente después de que se ejecute el script. (Un script de instalación generalmente hace esto, de todos modos).
Por ejemplo (elimine las declaraciones 'echo' para usar esto; solo se muestra "funcionando"):
#!/bin/bash
log=running_setup.txt
sudo_stat=sudo_status.txt
echo "========= running script $$ ========"
echo $$ >> $sudo_stat
trap 'rm -f $sudo_stat >/dev/null 2>&1' 0
trap "exit 2" 1 2 3 15
sudo_me() {
while [ -f $sudo_stat ]; do
echo "checking $$ ...$(date)"
sudo -v
sleep 5
done &
}
echo "=setting up sudo heartbeat="
sudo -v
sudo_me
echo "=running setup=" | tee $log
while [ -f $log ]
do
echo "running setup $$ ...$(date) ===" | tee -a $log
sleep 2
done
# finish sudo loop
rm $sudo_stat
Entonces verá ... (nota: el pid se coloca en el archivo tmp, para que pueda matarlo fácilmente. Sin embargo, no es necesario):
$ ./do_it.sh
========= running script 6776 ========
=setting up sudo heartbeat=
[sudo] password for user:
=running setup=
checking 6776 ...Wed May 4 16:31:47 PDT 2011
running setup 6776 ...Wed May 4 16:31:48 PDT 2011 ===
running setup 6776 ...Wed May 4 16:31:50 PDT 2011 ===
running setup 6776 ...Wed May 4 16:31:52 PDT 2011 ===
checking 6776 ...Wed May 4 16:31:53 PDT 2011
running setup 6776 ...Wed May 4 16:31:54 PDT 2011 ===
<ctrl-c> (cleans up files, then exits)
Basado en esta esencia , hice una versión concisa y limpia:
fuente
sudo -K
se invoca en otro lugar del script de shell, su versión le gritaríasudo: a password is required
al stderr cada minuto.Según la
sudo
página del manual:Entonces, supongo que si agrega algunos
sudo -v
puntos más de su script de configuración para validar la sesión (y no solo al principio) obtendrá lo que desea, ya que cada vez aumentará el tiempo de espera (solo le pedirá la contraseña nuevamente si se alcanza el tiempo de espera). El único problema será si hay un comando en su script que tome más tiempo que el tiempo de espera (por lo tanto, incluso si valida justo después de él, el tiempo de espera expirará antes de completarse para otra validación), pero este es un caso muy específico.Lo que sucede es que el solo uso
sudo
no aumenta el tiempo de espera ysudo -v
no ejecuta un comando, por lo que debe usarsudo -v
más veces para validar la sesión.fuente
Basándome en la esencia proporcionada por Gregory Perkins y mi experiencia, aquí está mi frase:
O
Explicaciones
trap "exit" INT TERM; trap "kill 0" EXIT
: Esto eliminará todo el árbol de procesos al salir o SIGINT / SIGTERM.sudo -v || exit $?
: Solicite la contraseña por adelantado y guarde en caché las credenciales de seguridad, pero no ejecute un comando. Si la contraseña no es correcta, salga con el código devuelto por sudo.sleep 1
: Demora un poco para que las credenciales de seguridad se guarden efectivamente. Si el siguiente sudo se ejecuta demasiado pronto, no lo sabrá porque las credenciales aún no se han guardado, por lo que le pedirá la contraseña nuevamente.while true; do sleep 60; sudo -nv; done 2>/dev/null &
: Actualice las credenciales de seguridad de sudo existentes repetidamente. Tenga en cuenta que esta versión difiere de la de la esencia vinculada: se ejecutasleep 60
primero y luegosudo -nv
.El
&
operador coloca todo elwhile
bucle en segundo plano y lo ejecuta como un proceso secundario.La
2>/dev/null
redirigir la stderr delwhile
bucle para el vacío, por lo que los mensajes de error generados por cualquier comando dentro del bucle se descartarán.La
-n
opción desudo
evita que solicite al usuario una contraseña, pero muestra un mensaje de error y sale si se requiere una contraseña.No hay nada
kill -0 "$$" || exit
como en la esencia vinculada, porque los primeros dostrap
s harán el trabajo. ¡No tendrá que dormir durante 59 segundos antes de darse cuenta de que el proceso principal no se está ejecutando!fuente