创建一个伪终端让 sudo 开心

lar*_*sks 7 cloud terminal sudo

我需要自动配置一个云实例(运行 Fedora 17),以下初始事实为真:

  • 我可以通过 ssh 密钥访问远程用户 ( 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)

    ...确实有效,但会消耗输出。

有没有其他可用的工具可以为我分配一个普遍可用的伪终端?

mgo*_*ven 6

您想要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如果脚本要以非交互方式运行,您可能需要使用。