Python子进程sudo返回错误:错误:['sudo:抱歉,你必须有一个tty来运行sudo \ n']

时间:2016-07-28 15:51:31

标签: python bash ssh subprocess sudo

这是我的代码:

import subprocess

HOST = 'host_name'
PORT = '111'
USER = 'user_name'
CMD = 'sudo su - ec2-user; ls'

process = subprocess.Popen(['ssh','{}@{}'.format(USER, HOST),
                        '-p', PORT, CMD],
                       shell=False,
                       stdout=subprocess.PIPE,
                       stderr=subprocess.PIPE)

result = process.stdout.readlines()

if not result:
    print "Im an error"
    err = process.stderr.readlines()
    print('ERROR: {}'.format(err))
else:
    print "I'm a success"
    print(result)

当我运行它时,我在终端中收到以下输出:

dredbounds-computer: documents$ python terminal_test.py
Im an error
ERROR: ['sudo: sorry, you must have a tty to run sudo\n']

我尝试了很多东西,但我一直收到这个错误“sudo:抱歉,你必须有一个tty才能运行sudo”。如果我只是通过终端手动执行它,它工作正常,但我需要自动执行此操作。我读到一个解决方法可能是在我的ssh调用中使用'-t'或'-tt',但是我还没能在subprocess中成功实现它(终端只为我挂起)。任何人都知道如何修复我的代码,或解决这个问题?理想情况下我想ssh,然后切换到sudo用户,然后从那里运行一个文件(我只是把ls用于测试目的)。

2 个答案:

答案 0 :(得分:1)

sudo正在提示您输入密码,但需要终端来执行此操作。传递-t-tt为远程命令提供了一个终端,但现在它正在等待您输入密码。

process = subprocess.Popen(['ssh','-tt', '{}@{}'.format(USER, HOST),
                          '-p', PORT, CMD],
                          shell=False,
                          stdout=subprocess.PIPE,
                          stderr=subprocess.PIPE,
                          stdin=subprocess.PIPE)
process.stdin.write("password\r\n")

请注意,ls在<{1}}退出后,<{1}}无法运行。您应该直接以su身份登录计算机(如果可能),或者只使用ec2-user运行您想要的任何命令,而无需先通过sudo

答案 1 :(得分:0)

您可以在不需要密码的情况下告诉sudo。只需将其添加到远程服务器/etc/sudoers上的host_name

user ALL = (ec2-user) NOPASSWD: ls

这允许名为user的用户在不输入密码的情况下将ls命令作为ec2-user执行。

这假设您将命令更改为这样,这对我来说似乎更合理:

CMD = 'sudo -u ec2-user ls'