2016-07-28 130 views
0

这里是我的代码:Python的子须藤返回错误:错误:“须藤:对不起,你必须有一个tty运行sudo的 n”]

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'] 

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

+0

为什么'须藤苏 - EC2用户; ls'而不只是'sudo -u ec2-user ls'? – miken32

回答

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不运行,直到su退出启动的shell。您应该直接以ec2-user的身份登录到计算机(如果可能),或者仅使用sudo先运行您想要的任何命令,而无需先通过su

+0

感谢您的回复。我尝试使用process.stdin.write(“密码”),因为你建议,但我得到︰ “AttributeError:'NoneType'对象没有属性'写'” 当我运行该。 – dredbound

+0

您是否通过'stdin = subprocess.PIPE'作为参数? – chepner

+0

错过了,但现在只是把我从控制台带回我的原始输出。 “错误:['sudo:对不起,你必须有一个tty才能运行sudo \ n']” – dredbound

0

您可以告诉sudo无需密码即可工作。只需将其添加到远程服务器host_name上的/etc/sudoers即可。

user ALL = (ec2-user) NOPASSWD: ls 

这允许命名user作为ec2-user要执行的命令ls无需输入密码的用户。

这是假设你改变你的命令看起来像这样,这似乎更合理的对我说:

CMD = 'sudo -u ec2-user ls' 
相关问题