Criando um pseudoterminal para tornar o sudo feliz

7

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?

    
por larsks 24.10.2012 / 15:43

1 resposta

6

Você deseja que a opção -t ssh :

 -t      Force pseudo-tty allocation.  This can be used to execute
         arbitrary screen-based programs on a remote machine, which can be
         very useful, e.g. when implementing menu services.  Multiple -t
         options force tty allocation, even if ssh has no local tty.

Você pode precisar usar -tt se o script for executado de forma não interativa.

    
por 25.10.2012 / 00:18