lar*_*sks 7 cloud terminal sudo
我需要自动配置一个云实例(运行 Fedora 17),以下初始事实为真:
cloud
)sudo
.手动配置就像登录和运行sudo su -
并拥有它一样简单,但我想完全自动化这个过程。诀窍是系统默认为requiretty
启用该选项sudo
,这意味着尝试执行以下操作:
ssh remotehost sudo yum -y install puppet
Run Code Online (Sandbox Code Playgroud)
将失败:
sudo: sorry, you must have a tty to run sudo
Run Code Online (Sandbox Code Playgroud)
我现在正在解决这个问题,首先推送一个将在伪终端上运行命令的小型 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()
Run Code Online (Sandbox Code Playgroud)
假设这是 named pty
,然后我可以运行:
ssh remotehost ./pty sudo yum -y install puppet
Run Code Online (Sandbox Code Playgroud)
这工作正常,但我想知道是否有我没有考虑过的解决方案。
expect
,但默认情况下未在此系统上安装它。screen
可以在紧要关头做到这一点,但我想出的最好的是:
screen -dmS sudo somecommand
Run Code Online (Sandbox Code Playgroud)
...确实有效,但会消耗输出。
有没有其他可用的工具可以为我分配一个普遍可用的伪终端?
您想要ssh-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.
Run Code Online (Sandbox Code Playgroud)
-tt
如果脚本要以非交互方式运行,您可能需要使用。