Eu preciso automatizar o provisionamento de uma instância de nuvem (executando o Fedora 17) para o qual os seguintes fatos iniciais são verdadeiros:
- Tenho acesso baseado em chave ssh a um usuário remoto (
cloud
)
- Esse usuário tem acesso root sem senha via
sudo
.
A configuração manual é tão simples quanto efetuar o login e executar sudo su -
, mas eu gostaria de automatizar totalmente esse processo. O truque é que o sistema tem como padrão ter a opção requiretty
habilitada para sudo
, o que significa que uma tentativa de fazer algo assim:
ssh remotehost sudo yum -y install puppet
Irá falhar:
sudo: sorry, you must have a tty to run sudo
Estou trabalhando em torno disso agora, primeiro empurrando um pequeno script Python que executará um comando em um pseudoterminal:
import os
import sys
import errno
import subprocess
pid, master_fd = os.forkpty()
if pid == 0:
# child process: now that we're attached to a
# pty, run the given command.
os.execvp(sys.argv[1], sys.argv[1:])
else:
while True:
try:
data = os.read(master_fd, 1024)
except OSError, detail:
if detail.errno == errno.EIO:
break
if not data:
break
sys.stdout.write(data)
os.wait()
Supondo que esse nome seja pty
, posso executar:
ssh remotehost ./pty sudo yum -y install puppet
Isso funciona bem, mas estou pensando se já existem soluções disponíveis que não considerei.
- Eu normalmente pensaria em
expect
, mas ele não é instalado por padrão neste sistema.
-
screen
pode fazer isso em um piscar de olhos, mas o melhor que consegui foi:
screen -dmS sudo somecommand
... que funciona, mas come a saída.
Existem outras ferramentas disponíveis que irão alocar um pseudo-terminal para mim que geralmente estarão disponíveis?