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 -Kse invoca en otro lugar del script de shell, su versión le gritaríasudo: a password is requiredal stderr cada minuto.Según la
sudopágina del manual:Entonces, supongo que si agrega algunos
sudo -vpuntos 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
sudono aumenta el tiempo de espera ysudo -vno ejecuta un comando, por lo que debe usarsudo -vmá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 60primero y luegosudo -nv.El
&operador coloca todo elwhilebucle en segundo plano y lo ejecuta como un proceso secundario.La
2>/dev/nullredirigir la stderr delwhilebucle para el vacío, por lo que los mensajes de error generados por cualquier comando dentro del bucle se descartarán.La
-nopción desudoevita 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 "$$" || exitcomo en la esencia vinculada, porque los primeros dostraps 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