这是我的代码:
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用于测试目的)。
答案 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'