Мне нужно автоматизировать подготовку экземпляра облака (под управлением Fedora 17), для которого верны следующие исходные факты:
cloud
)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
... который работает, но съедает результат.
Существуют ли какие-либо другие инструменты, которые выделят мне псевдотерминал и станут общедоступными?
Вы хотите -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
если сценарий будет запускаться в неинтерактивном режиме.