Создание псевдотерминала, чтобы сделать sudo счастливым

Мне нужно автоматизировать подготовку облачного экземпляра (под управлением Fedora 17), для которого верны следующие исходные факты:

  • У меня есть доступ по ssh-ключу к удаленному пользователю (cloud)
  • У этого пользователя есть root-доступ без пароля через sudo,

Ручная настройка так же проста, как войти и запустить sudo su - и имея на это, но я хотел бы полностью автоматизировать этот процесс. Хитрость в том, что система по умолчанию имеет requiretty опция включена для sudoЭто означает, что попытка сделать что-то вроде этого:

ssh remotehost sudo yum -y install puppet

Не удастся:

sudo: sorry, you must have a tty to run sudo

Сейчас я работаю над этим, сначала запустив небольшой скрипт на Python, который будет запускать команду на псевдотерминале:

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()

Предполагая, что это называется ptyЯ могу запустить:

ssh remotehost ./pty sudo yum -y install puppet

Это прекрасно работает, но мне интересно, есть ли уже доступные решения, которые я не рассматривал.

  • Я бы обычно думал о expect, но он не установлен по умолчанию в этой системе.
  • screen может сделать это в крайнем случае, но лучшее, что я придумал, было:

    screen -dmS sudo somecommand
    

    ... который работает, но съедает результат.

Существуют ли какие-либо другие инструменты, которые выделят мне псевдотерминал, которые станут общедоступными?

1 ответ

Решение

Вы хотите -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.

Вам может понадобиться использовать -tt если сценарий будет выполняться не в интерактивном режиме.

Другие вопросы по тегам