簡體   English   中英

卡在 fork 中的 os.read()

[英]getting stuck at os.read() inside a fork

我使用下面的代碼創建了一個子進程,進入 ssh 容器,在子進程中運行命令並獲取其 output。

import os
import pty

def wall(host, pw):
    pid, fd = pty.fork()
    if pid == 0: # Child
        os.execvp('ssh', ['ssh', host, 'ls', '/usr/bin/wall'])
        os._exit(1) # fail to execv

    # read '..... password:', write password
    os.read(fd, 1024)
    os.write(fd, pw + '\n')

    result = []
    while True:
        try:
            #time.sleep(1)
            data = os.read(fd, 1024)
        except OSError:
            break
        if not data:
            break
        result.append(data)
    pid, status = os.waitpid(pid, 0)
    #pid, status = os.waitpid(pid,os.WNOHANG)
    return status, ''.join(result)

status, output = wall('localhost', "secret")
print status
print output

即使這在您第一次調用 wall() 時有效(或者有時在您調用 wall() 的前幾次),如果您再次調用 wall(),它會卡在 data=os.read(fd,1024) 或 os .waitpid(pid,0)。 每次我調用 wall().

注意:我不允許使用 pexpect、paramiko 等外部庫。

也許有時 os.read 不會等待密碼提示。 在這種情況下,只有兩種選擇:

  • 使用專用的 package 通過 ssh 連接; 例如如何使 ssh 與 python 連接
  • 解析 output 並在提示后才傳遞密碼。 嘗試調試 os.read 的第一次調用; 可能這將澄清不穩定的行為。

暫無
暫無

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

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