我正在尝试使用python子进程模块,以便ssh到服务器,然后切换到超级用户然后ls并打印终端中的文件夹。
我的代码:
def sudo_Test():
HOST = 'Host'
PORT = '227'
USER = 'user'
cmd='sudo su - ec2-user;ls'
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("my_password\r\n")
print "stuck here VVV"
result = process.stdout.readlines()
print "finished it"
if not result:
print "Im an error"
err = process.stderr.readlines()
print('ERROR: {}'.format(err))
else:
print "I'm a success"
print result
print sudo_Test()
运行时的控制台输出:
dredbounds-computer:folder dredbound$ python terminal_test.py
stuck here VVV
由于某种原因,代码卡在行result.process.stdout.readlines()上。当发生这种情况时,我必须cntrl + c退出终端会话。如果我只做cmd =' sudo,它工作正常; LS'而不是cmd =' sudo su - ec2-user; ls&#39 ;.Anyone知道我做错了什么或者我怎么能让它工作?
更新: 我改变了cmd =' sudo su - ec2-user; ls' - > cmd =' sudo su - ec2-user ls'在上面的代码中。现在我收到以下错误:
['password\r\n', '\r\n', '/bin/ls: /bin/ls: cannot execute binary file\r\n']
我不确定为什么它认为ls现在是一个二进制文件,但无论如何我可以告诉它它只是一个终端命令,所以它返回一个目录列表?
答案 0 :(得分:1)
问题在于:
--dirty[=<mark>]
Describe the working tree. It means describe HEAD and appends <mark> (-dirty by default) if
the working tree is dirty.
sudo su - ec2-user;ls
打开一个shell,等待输入。在shell退出并运行sudo su - ec2-user
命令之前,您需要向shell发送一个exit命令(或关闭它的stdin)。
如果您的目标是以用户ls
运行ls
,请尝试:
ec2-user
换句话说,替换
sudo -u ec2-user ls
使用:
cmd='sudo su - ec2-user;ls'