Eu tenho um script executado a partir do crontab de usuários não privilegiados que chama alguns comandos usando sudo
. Exceto que não. O script funciona bem, mas os comandos sudo'ed falham silenciosamente.
O script é executado perfeitamente a partir de um shell como o usuário em questão.
Sudo não requer uma senha. O usuário em questão tem
(root) NOPASSWD: ALL
acesso concedido em/etc/sudoers
.Cron está executando e executando o script. Adicionar um simples
date > /tmp/log
produz saída no momento certo.Não é um problema de permissões. Novamente, o script é executado, mas não os comandos sudo'ed.
Não é um problema de caminho. A execução
env
de dentro do script que está sendo executado mostra a$PATH
variável correta que inclui o caminho para o sudo. Executá-lo usando um caminho completo não ajuda. O comando que está sendo executado recebe o nome completo do caminho.Tentar capturar a saída do comando sudo, incluindo STDERR, não mostra nada de útil. Adicionar
sudo echo test 2>&1 > /tmp/log
ao script produz um log em branco.O próprio binário sudo executa bem e reconhece que possui permissões mesmo quando executado a partir do cron dentro do script. Adicionar
sudo -l > /tmp/log
ao script produz a saída:O usuário ec2-user pode executar os seguintes comandos neste host:
(root) NOPASSWD: ALL
Examinar o código de saída do comando usando $?
mostra que ele está retornando um erro (código de saída :) 1
, mas nenhum erro parece ser produzido. Um comando tão simples quanto /usr/bin/sudo /bin/echo test
retorna o mesmo código de erro.
O que mais poderia estar acontecendo?
Esta é uma máquina virtual criada recentemente, executando a mais recente Amazon Linux AMI. O crontab pertence ao usuário ec2-user
e o arquivo sudoers é o padrão de distribuição.
The user in question has (root) NOPASSWD: ALL access granted in /etc/sudoers
e meu cérebro começou a gritar alto demais para continuar lendo.sudo
direitos restritos / somente / para os comandos necessários no script e desativar completamente a capacidade de logon.Respostas:
O Sudo tem algumas opções especiais em seu arquivo de permissões, uma das quais permite uma restrição de uso para os shells que estão sendo executados dentro de um TTY, o que o cron não.
Algumas distribuições, incluindo a Amazon Linux AMI, têm isso ativado por padrão. O
/etc/sudoers
arquivo terá a seguinte aparência:Se você capturasse a saída para STDERR no nível do script shell, em vez do próprio comando sudo, você teria uma mensagem parecida com esta:
A solução é permitir que o sudo seja executado em ambientes não TTY removendo ou comentando estas opções:
fonte
Defaults !visiblepw
esteja ativado / não comentado.