Como fazer com que o sudo não expire enquanto o script está em execução [duplicar]

Dec 22 2020

Às vezes, preciso executar um script por horas a fio, durante as quais alguns comandos são necessários sudo. No entanto, se eu não verificar e reinserir a sudosenha periodicamente, obtenho o sudo: timed out reading passworderro que às vezes quebra tudo. Não quero usar, sudo myscript.shpois alguns dos comandos devem ser executados sem sudo .

Eu gostaria que a sudosenha em cache persistisse para o script por toda a duração do script, sem alterar o resto do sistema ( sudopersistência apenas para este 1 script).

Existe uma maneira de fazer sudodurar toda a duração do script e apenas 1 script?

Respostas

KamilMaciorowski Dec 22 2020 at 13:53

Possibilidade: execute o script com sudo myscript.sh. Dentro do script, execute comandos que devem ser executados sem sudoesta maneira:

sudo -u "$SUDO_USER" foo args

(talvez com a lógica adequada no caso de todo o script ser executado sem isso sudo). O usuário root não precisa se autenticar sudoe, como tal, não é necessário inserir uma senha para executar um comando como outro usuário .

Dependendo do tamanho do script (o quanto você precisa mudá-lo) e como você se sente sobre rodar a coisa toda com sudovocê pode gostar ou não da ideia. Em sua abordagem atual, o código não elevado é o padrão, as linhas sudosendo exceções explícitas. Minha abordagem vira isso de cabeça para baixo. Você precisa ter mais cuidado ao criar e testar o script. Admito que essa não é a melhor prática; ainda resolve o problema de expiração sudo.

Pessoalmente, eu usaria essa solução para um script de longa execução que não seja muito complicado (loop simples, poucos comandos). Eu pensaria duas vezes antes de reconstruir um script complicado.


Outra abordagem é atualizar periodicamente as credenciais em cache em segundo plano. Por padrão, eles são adequados (consulte tty_tickets). Proceda assim:

sudo -v                              # to enter your password once
while sleep 300; do sudo -v; done &  # adjust the interval if needed
myscript.sh

Não se esqueça de eliminar o trabalho em segundo plano quando não for mais necessário. O próprio script pode iniciar esse trabalho; então provavelmente você desejará algumas armadilhas no script para eliminar o trabalho automaticamente quando o script terminar.