“ssh sudo -u user -i”的 subprocess.Popen 失败并显示“sudo:抱歉,你必须有一个 tty 才能运行 sudo”

Arc*_*ger 3 python ssh sudo tty

我想通过 ssh 进入远程服务器,更改用户然后执行脚本。我正在subprocess这样做,但它似乎sudo -u userB -i没有改变用户。

HOST = 'remote_server'
USER = 'userA'
CMD = ' whoami; sudo -u userB -i; whoami'

ssh = subprocess.Popen(['ssh', '{}@{}'.format(USER, HOST),CMD],
                            shell=False,
                            stdout=subprocess.PIPE,
                            stderr=subprocess.PIPE)
result = ssh.stdout.readlines()   
if not result:
    err = ssh.stderr.readlines()
    print('ERROR: {}'.format(err))
else:
    print "success"
    print(result) 

$ success
$ ['userA\n', 'userA\n']
Run Code Online (Sandbox Code Playgroud)

当我替换为 时CMD ='sudo -u userB -i && whoami',出现此错误:

错误:['sudo:抱歉,你必须有一个 tty 才能运行 sudo\n']

在终端上,我可以进行无密码 ssh, sudo -u userB -i && whoami

Mar*_*ryl 5

sudo在目标系统上配置为需要终端仿真。这样做通常是为了防止您尝试实施的那种自动化。在尝试绕过该限制之前,请咨询您的服务器管理员。要么不需要限制,然后管理员可以为您关闭它。或者限制是有原因的,管理员不会因为您试图绕过它而感到高兴。

可以通过requirettysudoers文件中删除选项来关闭限制(默认情况下该选项是关闭的)。


ssh对其命令行上提供的命令使用终端仿真,您需要使用-tswitch。但是-t要真正产生任何效果,您首先需要ssh从终端运行。由于subprocess.Popen不是终端,您将获得:

不会分配伪终端,因为 stdin 不是终端

要绕过它,您必须使用双-t开关:-tt