Możesz skonfigurować pętlę, która działa w tle, aby okresowo uruchamiać „sudo -v”, sztuczka polega na tym, aby pętla zakończyła się po zakończeniu skryptu. Musi więc istnieć pewien rodzaj komunikacji między tymi dwoma procesami; Pliki tmp są do tego odpowiednie i można je łatwo wyczyścić po uruchomieniu skryptu. (Skrypt instalacyjny zwykle tak robi.)
Na przykład (usuń instrukcje „echo”, aby użyć tego; te po prostu pokazują, że „działa”):
#!/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
Wtedy zobaczysz ... (uwaga: pid jest umieszczany w pliku tmp, abyś mógł go łatwo zabić. Nie jest to jednak konieczne):
$ ./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)
Na podstawie tego GIST , zrobiłem zwięzły i czystą wersję:
źródło
sudo -K
zostanie wywołana w innym miejscu skryptu powłoki, twoja wersja będzie krzyczećsudo: a password is required
do stderr co minutę.Według strony podręcznika
sudo
:Sądzę więc, że jeśli dodasz
sudo -v
więcej punktów w skrypcie instalacyjnym, aby sprawdzić poprawność sesji (i to nie tylko na początku), dostaniesz to, czego chcesz, ponieważ za każdym razem zwiększa limit czasu (pyta tylko o hasło, jeśli limit czasu został osiągnięty). Jedynym problemem będzie, jeśli w skrypcie pojawi się polecenie, które zajmuje więcej czasu niż limit czasu (więc nawet jeśli sprawdzasz poprawność zaraz po tym, limit czasu upłynie przed zakończeniem kolejnej weryfikacji), ale jest to bardzo szczególny przypadek.To, co się dzieje, polega na tym, że samo użycie
sudo
nie zwiększa limitu czasu isudo -v
nie wykonuje polecenia, więc musisz użyćsudo -v
więcej razy, aby sprawdzić poprawność sesji.źródło
Baza na GIST dostarczonych przez Gregory Perkins i mojego doświadczenia, oto mój jeden-liner:
Lub
Objaśnienia
trap "exit" INT TERM; trap "kill 0" EXIT
: Spowoduje to usunięcie całego drzewa procesów przy wyjściu lub SIGINT / SIGTERM.sudo -v || exit $?
: Poproś o hasło z góry i buforuj poświadczenia bezpieczeństwa, ale nie uruchamiaj polecenia. Jeśli hasło jest nieprawidłowe, wyjdź z kodem zwróconym przez sudo.sleep 1
: Opóźnij trochę, aby poświadczenia bezpieczeństwa zostały skutecznie zapisane. Jeśli następne sudo uruchomi się zbyt wcześnie, nie będzie o tym wiedział, ponieważ poświadczenia nie zostały jeszcze zapisane, dlatego poprosi o hasło ponownie.while true; do sleep 60; sudo -nv; done 2>/dev/null &
: Aktualizuj istniejące poświadczenia zabezpieczeń sudo wielokrotnie. Zauważ, że ta wersja różni się od jednej z powiązanych linków:sleep 60
najpierw działa , a potemsudo -nv
.&
Operator stawia całąwhile
pętlę w tle, uruchamiając go jako procesu potomnego.2>/dev/null
Przekierować stderr zwhile
pętli do nieważna, więc komunikaty o błędach generowane przez jakiekolwiek polecenia wewnątrz pętli zostaną odrzucone.-n
Opcjasudo
uniemożliwia monitowania użytkownika o hasło, ale wyświetla komunikat o błędzie i wyjście, jeśli wymagane jest hasło.Nie ma
kill -0 "$$" || exit
jak w połączonej treści, ponieważ pierwsze dwatrap
s wykonają zadanie. Nie będzie musiał spać przez 59 sekund, zanim zorientuje się, że proces nadrzędny nie jest uruchomiony!źródło