Eu tenho um grande script bash (Ubuntu 12.04). O script foi projetado para ser chamado por um usuário comum; Apenas determinados comandos no script são executados com o sudo. Não é uma opção para executar o script inteiro como root.
Dentro do script, tenho muitas declarações semelhantes a estas:
echo "blah blah" | sudo tee /path/to/file
e
sudo tee /path/to/file > /dev/null << 'END'
blah blah
END
A forma dessas instruções é em grande parte devido ao script ser projetado para não ser executado como root. Eu coloquei muito trabalho em obter essas declarações certas. (Foi uma experiência de aprendizagem para mim.)
O script funciona bem e eu não quero alterá-lo massivamente. Na verdade, não quero alterá-lo de forma alguma porque ele é depurado e funciona em um ambiente de produção (tipo de).
No entanto, quero adicionar um registro melhor. Por isso, adicionei as seguintes linhas ao início do meu script bash, de acordo com o link
#!/bin/bash
>foo.log
exec > >(tee -a foo.log)
exec 2> >(tee -a foo.log >&2)
No entanto, agora, quando executo o script, ele me pede a senha para cada instância dos exemplos de comando sudo / tee mostrados acima (cerca de 50 deles!).
Existe uma solução para isso que não me obrigue a alterar significativamente o código existente? Eu só quero registrar a saída do script sem alterar como ele é executado (incluindo sem exigir a entrada de senha muitas vezes em um curto espaço de tempo).
Aqui está o código que mostra o problema:
#!/bin/bash
sudo -k
>foo.log #truncate log file to start fresh
exec > >(tee -a foo.log)
exec 2> >(tee -a foo.log >&2)
if [ -f fileone.txt ] ; then
echo "sudo rm fileone.txt"
sudo rm fileone.txt
fi
echo "sudo touch fileone.txt"
sudo touch fileone.txt
echo "sudo touch filetwo.txt"
sudo touch filetwo.txt
sudo touch /opt/file3.txt
echo "blah blah" | sudo tee /opt/file3.txt
sudo rm /opt/file3.txt
exit
Resultado esperado:
insira a senha uma vez e o script inteiro é executado
Resultado real:
tem que digitar a senha novamente para echo "blah blah" | sudo tee /opt/file3.txt
e quaisquer declarações semelhantes do formulário fornecido na parte superior desta pergunta. Mas somente se o código de registro no topo do script for usado. Sem o registro, não há problema.