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