Sie können eine Schleife einrichten, die im Hintergrund ausgeführt wird, um "sudo -v" regelmäßig auszuführen. Der Trick besteht natürlich darin, die Schleife beim Beenden des Skripts sauber zu beenden. Es muss also eine Art Kommunikation zwischen den beiden Prozessen geben. tmp-Dateien sind hierfür in Ordnung und können auch nach Ausführung des Skripts problemlos bereinigt werden. (Ein Installationsskript erledigt dies normalerweise sowieso.)
Zum Beispiel (entfernen Sie die 'echo'-Anweisungen, um dies zu verwenden; diese zeigen nur, dass es "funktioniert"):
#!/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
Dann werden Sie sehen ... (Hinweis: Die PID wird in die tmp-Datei eingefügt, damit Sie sie leicht töten können. Dies ist jedoch nicht erforderlich.):
$ ./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)
Ausgehend von diesem Kern habe ich eine kurze und übersichtliche Version erstellt:
quelle
sudo -K
an einer anderen Stelle des Shell-Skripts aufgerufen wird, würde Ihre Versionsudo: a password is required
jede Minute nach stderr rufen.Nach der
sudo
Manpage:Wenn Sie also einige
sudo -v
Punkte in Ihrem Setup-Skript hinzufügen , um die Sitzung zu validieren (und nicht nur zu Beginn), erhalten Sie das, was Sie möchten, da dies jedes Mal die Zeitüberschreitung erhöht (und Sie werden nur dann erneut nach dem Kennwort gefragt, wenn das Timeout ist erreicht). Das einzige Problem besteht darin, dass ein Befehl in Ihrem Skript mehr Zeit als das Timeout benötigt (selbst wenn Sie ihn direkt danach validieren, läuft das Timeout ab, bevor er für eine weitere Validierung abgeschlossen ist). Dies ist jedoch ein sehr spezifischer Fall.Was passiert, ist, dass nur die Verwendung
sudo
das Zeitlimit nicht erhöht undsudo -v
keinen Befehl ausführt, sodass Siesudo -v
mehr Zeit benötigen, um die Sitzung zu validieren.quelle
Hier ist mein Einzeiler, basierend auf dem Inhalt von Gregory Perkins und meiner Erfahrung:
Oder
Erklärungen
trap "exit" INT TERM; trap "kill 0" EXIT
: Hiermit wird der gesamte Prozessbaum beim Beenden oder bei SIGINT / SIGTERM geschlossen.sudo -v || exit $?
: Fragen Sie im Voraus nach dem Kennwort, und speichern Sie die Sicherheitsanmeldeinformationen im Cache. Führen Sie jedoch keinen Befehl aus. Wenn das Passwort nicht korrekt ist, beenden Sie es mit dem von sudo zurückgegebenen Code.sleep 1
: Verzögern Sie etwas, damit die Sicherheitsdaten effektiv gespeichert werden. Wenn das nächste Sudo zu früh ausgeführt wird, wird es es nicht kennen, da die Anmeldeinformationen noch nicht gespeichert wurden. Daher werden Sie erneut nach dem Kennwort gefragt.while true; do sleep 60; sudo -nv; done 2>/dev/null &
: Aktualisieren Sie die vorhandenen sudo-Sicherheitsanmeldeinformationen wiederholt. Beachten Sie, dass sich diese Version von der der verknüpften Version unterscheidet: Sie wirdsleep 60
zuerst und dann ausgeführtsudo -nv
.Der
&
Operator stellt die gesamtewhile
Schleife in den Hintergrund und führt sie als untergeordneten Prozess aus.Das
2>/dev/null
Umleiten des Befehls stderr derwhile
Schleife in die Leere, sodass Fehlermeldungen, die von Befehlen innerhalb der Schleife generiert werden, verworfen werden.Die
-n
Optionsudo
verhindert, dass der Benutzer zur Eingabe eines Kennworts aufgefordert wird, zeigt jedoch eine Fehlermeldung an und beendet sich, wenn ein Kennwort erforderlich ist.Es gibt kein
kill -0 "$$" || exit
wie im verknüpften Kern, weil die ersten beidentrap
s den Job erledigen. Es muss 59 Sekunden lang nicht schlafen, bevor festgestellt wird, dass der übergeordnete Prozess nicht ausgeführt wird!quelle