我需要自动配置云实例(运行 Fedora 17),并且以下初始事实属实:
- 我有基于 ssh-key 的远程用户访问权限(
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
...虽然有效,但会降低产出。
是否有其他可用的工具可以为我分配一个伪终端,并且将会普遍可用?
答案1
您希望-t
选择远程控制:
-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
如果脚本以非交互方式运行,则可能需要使用。