Vous pouvez configurer une boucle qui s'exécute en arrière-plan pour exécuter périodiquement "sudo -v", l'astuce consiste bien sûr à ce que la boucle se termine proprement lorsque votre script se termine. Il doit donc y avoir un certain type de communication entre les deux processus; Les fichiers tmp sont parfaits pour cela, et ils peuvent également être facilement nettoyés après l'exécution du script. (Un script d'installation fait généralement cela, de toute façon.)
Par exemple (supprimez les instructions 'echo' pour utiliser ceci; celles-ci montrent simplement que cela "fonctionne"):
#!/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
Ensuite, vous verrez ... (note: le pid est placé dans le fichier tmp, juste pour que vous puissiez facilement le tuer. Ce n'est pas nécessaire, cependant):
$ ./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)
Sur la base de cet essentiel , j'ai fait une version concise et propre:
la source
sudo -K
est invoquée à un autre endroit du script shell, votre version crieraitsudo: a password is required
au stderr chaque minute.Selon la
sudo
page de manuel:Donc, je suppose que si vous en ajoutez
sudo -v
en plus de points de votre script de configuration pour valider la session (et pas seulement au début), vous obtiendrez ce que vous voulez, car à chaque fois cela augmentera le délai (il ne demandera à nouveau le mot de passe que si le délai est atteint). Le seul problème sera s'il y a une commande sur votre script qui prend plus de temps que le délai d'expiration (donc même si vous validez juste après, le délai expirera avant de se terminer pour une autre validation), mais c'est un cas très spécifique.Ce qui se passe, c'est que l'utilisation
sudo
n'augmente pas le délai d'expiration etsudo -v
n'exécute pas de commande, vous devez donc utilisersudo -v
plus de temps pour valider la session.la source
Sur la base de l' essentiel fourni par Gregory Perkins et de mon expérience, voici mon one-liner:
Ou
Explications
trap "exit" INT TERM; trap "kill 0" EXIT
: Cela supprimera tout l'arborescence de processus à la sortie ou SIGINT / SIGTERM.sudo -v || exit $?
: Demandez le mot de passe à l'avance et mettez en cache les informations d'identification de sécurité, mais n'exécutez pas de commande. Si le mot de passe n'est pas correct, quittez avec le code renvoyé par sudo.sleep 1
: Retardez un peu pour que les informations de sécurité soient effectivement enregistrées. Si le prochain sudo s'exécute trop tôt, il ne le saura pas car les informations d'identification ne sont pas encore enregistrées, il vous demandera donc à nouveau le mot de passe.while true; do sleep 60; sudo -nv; done 2>/dev/null &
: Mettez à jour les informations d'identification de sécurité sudo à plusieurs reprises. Notez que cette version diffère de celle de l'essentiel lié: elle s'exécute ensleep 60
premier, puissudo -nv
.L'
&
opérateur place lawhile
boucle entière en arrière-plan, l'exécutant en tant que processus enfant.La
2>/dev/null
redirection du stderr de lawhile
boucle vers le vide, donc les messages d'erreur générés par toutes les commandes à l'intérieur de la boucle seront ignorés.L'
-n
option de l'sudo
empêche d'inviter l'utilisateur à saisir un mot de passe, mais affiche un message d'erreur et quitte si un mot de passe est requis.Il n'y a rien
kill -0 "$$" || exit
comme dans l'essentiel lié, parce que les deux premierstrap
s feront l'affaire. Il n'aura pas à dormir pendant 59 secondes avant de comprendre que le processus parent n'est pas en cours d'exécution!la source