簡體   English   中英

Python子進程stdout.readlines()被卡住

[英]Python subprocess stdout.readlines() getting stuck

我試圖使用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'。有人知道我做錯了什么或如何使它工作?

更新:我在上面的代碼中更改了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是一個二進制文件,但是無論如何我可以告訴我那只是一個終端命令,所以它返回目錄列表嗎?

問題在這里:

sudo su - ec2-user;ls

sudo su - ec2-user打開一個shell並等待輸入。 您需要在外殼程序退出並運行ls命令之前向外殼程序發送退出命令(或關閉其標准輸入)。

如果您的目標是以ec2-user身份運行ls ,請嘗試:

sudo -u ec2-user ls

換句話說,替換

cmd='sudo su - ec2-user;ls'

帶有:

cmd='sudo -u ec2-user ls'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM