我需要自动配置云实例(运行 Fedora 17),以下初始事实为真:
- 我有基于 ssh 密钥的远程用户访问权限 (
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()
假设这是 named pty
,然后我可以运行:
ssh remotehost ./pty sudo yum -y install puppet
这工作正常,但我想知道是否有我没有考虑过的可用解决方案。
- 我通常会考虑
expect
,但默认情况下它没有安装在这个系统上。 screen
可以在紧要关头做到这一点,但我想到的最好的是:screen -dmS sudo somecommand
...这确实有效但会吃掉输出。
是否有任何其他可用的工具可以为我分配一个普遍可用的伪终端?
您想要ssh
-t
的选项:-tt
如果脚本将以非交互方式运行,您可能需要使用。