Python子进程stdout.readlines()卡住了

时间:2016-08-11 22:12:36

标签: python linux bash subprocess sudo

我正在尝试使用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现在是一个二进制文件,但无论如何我可以告诉它它只是一个终端命令,所以它返回一个目录列表?

1 个答案:

答案 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'