tee / sudo conflito de cache de senha?

3

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.

    
por MountainX 27.02.2014 / 07:59

2 respostas

2

Você tem a opção tty_tickets ativada em sua configuração do sudo. Esta é a configuração padrão. Essa opção diz ao sudo que, se você autenticar digitando sua senha em um terminal, isso apenas valida o uso do sudo nesse terminal.

Quando você adicionou esses redirecionamentos, o sudo perdeu a conexão com seu terminal. (Acho que o sudo usa a configuração PAM_TTY do pam para determinar em qual terminal está sendo executado; não sei como isso é determinado.) Em caso de dúvida, o sudo pergunta o tempo todo.

A opção tty_tickets só é útil se você tiver deixado uma sessão de login autônoma em um terminal em algum lugar, onde um transeunte casual pode tentar executar sudo para passar da sua conta para a raiz. Ele não tem impacto contra invasores levemente sofisticados que podem plantar malware em sua conta e sequestrar na próxima vez que você executar o sudo. Portanto, não há benefício real para esta opção, é apenas um obstáculo.

Para desativar a opção, execute visudo para editar a configuração do sudo e adicione a linha

Defaults !tty_tickets
    
por 28.02.2014 / 03:57
0

Aproveitando a a resposta de Giles , apresentei essa sugestão de sua sugestão:

Primeiro, crie este arquivo de script:

#!/bin/bash
echo "Defaults !tty_tickets" >> $1
exit 0

Em segundo lugar, inclua isso no script principal, perto do começo:

sudo grep -i "Defaults !tty_tickets" /etc/sudoers 
if [ $? -ne 0 ] ; then
    sudo chmod a+x $SRCDIR/install_scripts/no_tty_tickets.sh
    sudo -E EDITOR=$SRCDIR/install_scripts/no_tty_tickets.sh su -c visudo
fi

Ele edita corretamente o / etc / sudoers. Aqui está o resultado:

#
# This file MUST be edited with the 'visudo' command as root.
#
...

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

# See sudoers(5) for more information on "#include" directives:

#includedir /etc/sudoers.d

Defaults !tty_tickets

Isso funciona e me dá a solução completa.

    
por 28.02.2014 / 05:28

Tags