创建一个伪终端来让 sudo 开心

创建一个伪终端来让 sudo 开心

我需要自动配置云实例(运行 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如果脚本以非交互方式运行,则可能需要使用。

相关内容