sudo: Sorry, you must have a tty to run sudo
Execute visudo
e adicione a seguinte linha para desativar requiretty
para seu usuário:
Defaults:username !requiretty
Estou desenvolvendo um bootstrapper automático para alguns servidores, já que estamos usando o Amazon EC2 para nossa infraestrutura.
O que eu faço é: executar um script Fabric que se conecta ao EC2 e inicializa uma nova instância, colocando em user-data um script cloud-init. Esse script faz o check-out de um projeto do Mercurial que contém tarefas do Fabric e, depois do checkout, o script descobrirá em qual tipo de servidor está sendo executado e executará uma tarefa local específica do Fabric.
Meu problema é que algumas tarefas precisam executar comandos sudo, como o script foi inicializado a partir do cloud-init acontece que o sudo avisa sobre a necessidade de executar um tty, tentei modificar isso para executar su --session-command="my commands to restart services" root
e ele não (e parece que isso não deveria funcionar).
Então, como posso executar comandos sudo neste script de inicialização?
Algum código:
cloud_init_script:
#!/bin/sh
su --session-command="\
source /etc/profile; \
cd /home/my_user; \
hg clone ssh://fabric_tasks_repo fabric; \
/usr/local/bin/fab -f /home/my_user/fabric/fabfile.py \'ec2-describe-tags --filter \"resource-type=instance\" --filter \"resource-id=$(ec2-metadata -i | cut -d ' ' -f2)\" --filter \"key=type\" | cut -f5\' > /home/my_user/fabric.log 2>&1" my_user &
O truque na linha /usr/local/bin/fab
é que ele executará alguns scripts ec2 para verificar qual tag-key "type" o servidor está usando.
sua melhor aposta (e provavelmente mais confiável) é dar ao usuário acesso correto ao sudo aos comandos necessários e com o sinalizador NOPASSWD
por exemplo, se seu usuário executando o script for bob, para recarregar o nginx via sudo sem uma senha, a sintaxe de / etc / sudoers seria:
bob ALL= NOPASSWD: /etc/init.d/nginx reload
seu script acima seria efetivamente alterado para:
sudo -u my_user hg clone ssh://fabric_tasks_repo /home/my_user/fabric
sudo -u my_user /usr/local/bin/fab -f /home/my_user/fabric/fabfile.py 'ec2-describe-tags --filter "resource-type=instance" --filter "resource-id=$(ec2-metadata -i | cut -d ' ' -f2)" --filter "key=type" | cut -f5' > /home/my_user/fabric.log 2>&1 &
você pode ou não precisar escapar de suas citações, mas eu as removi para maior clareza
para que seu arquivo sudoers tenha o usuário no qual você executa o script, mas ele pode executar esses comandos como o usuário my_user