Назад | Перейти на главную страницу

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

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

Ручная настройка так же проста, как вход в систему и запуск 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

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

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

Вы хотите -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 если сценарий будет запускаться в неинтерактивном режиме.