Você pode configurar um loop que é executado em segundo plano para executar periodicamente "sudo -v", o truque é fazer com que o loop termine de maneira limpa quando o script terminar. Portanto, deve haver algum tipo de comunicação entre os dois processos; Os arquivos tmp são bons para isso e também podem ser facilmente limpos após a execução do script. (Um script de instalação geralmente faz isso, de qualquer maneira.)
Por exemplo (remova as instruções 'echo' para usar isso; elas apenas mostram "trabalhando"):
#!/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
Então você verá ... (nota: o pid é colocado no arquivo tmp, apenas para que você possa matá-lo facilmente. Porém, não é necessário):
$ ./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)
Com base nessa essência , fiz uma versão concisa e limpa:
fonte
sudo -K
for invocada em outro lugar do shell script, sua versão gritarásudo: a password is required
com o stderr a cada minuto.De acordo com a
sudo
página do manual:Então, acho que se você adicionar mais alguns
sudo -v
pontos do seu script de configuração para validar a sessão (e não apenas no início), obterá o que deseja, pois cada vez que isso aumenta o tempo limite (ele só pede a senha novamente se o tempo limite é atingido). O único problema será se houver um comando no seu script que demore mais tempo do que o tempo limite (mesmo se você validar logo após o tempo limite expirar antes de concluir para outra validação), mas esse é um caso muito específico.O que acontece é que apenas o uso
sudo
não aumenta o tempo limite esudo -v
não executa um comando; portanto, você precisa usarsudo -v
mais vezes para validar a sessão.fonte
Baseando-nos na essência fornecida por Gregory Perkins e na minha experiência, aqui está o meu artigo:
Ou
Explicações
trap "exit" INT TERM; trap "kill 0" EXIT
: Isso derrubará toda a árvore do processo na saída ou no SIGINT / SIGTERM.sudo -v || exit $?
: Solicite a senha antecipadamente e armazene em cache as credenciais de segurança, mas não execute um comando. Se a senha não estiver correta, saia com o código retornado pelo sudo.sleep 1
: Demore um pouco para que as credenciais de segurança sejam efetivamente salvas. Se o próximo sudo for executado muito cedo, ele não saberá, porque as credenciais ainda não foram salvas, portanto, solicitará a senha novamente.while true; do sleep 60; sudo -nv; done 2>/dev/null &
: Atualize as credenciais de segurança sudo existentes repetidamente. Observe que esta versão difere daquela da essência vinculada: é executadasleep 60
primeiro e depoissudo -nv
.O
&
operador coloca todo owhile
loop em segundo plano, executando-o como um processo filho.O
2>/dev/null
redireciona o stderr dowhile
loop para o vazio, para que as mensagens de erro geradas por qualquer comando dentro do loop sejam descartadas.A
-n
opçãosudo
impede que ele solicite uma senha ao usuário, mas exiba uma mensagem de erro e saia se for necessária uma senha.Não há
kill -0 "$$" || exit
como na essência vinculada, porque os dois primeirostrap
s farão o trabalho. Ele não precisará dormir por 59 segundos antes de descobrir que o processo pai não está sendo executado!fonte