Python的子须藤返回错误:错误:“须藤:对不起,你必须有一个tty运行sudo的\ n”]
问题描述:
这里是我的代码: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用于测试目的)。
答
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
。
答
您可以告诉sudo
无需密码即可工作。只需将其添加到远程服务器host_name
上的/etc/sudoers
即可。
user ALL = (ec2-user) NOPASSWD: ls
这允许命名user
作为ec2-user
要执行的命令ls
无需输入密码的用户。
这是假设你改变你的命令看起来像这样,这似乎更合理的对我说:
CMD = 'sudo -u ec2-user ls'
为什么'须藤苏 - EC2用户; ls'而不只是'sudo -u ec2-user ls'? – miken32