在fork中的os.read()处卡住了。

问题描述 投票:0回答:1

我用下面的代码创建了一个子进程,进入一个ssh容器,在子进程中运行一个命令,并得到它的输出。

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)。

注意:我不允许使用外部库,如peexpect,paramiko等。

python multithreading ssh operating-system pty
1个回答
0
投票

也许有时os.read不会等待密码提示,在这种情况下只有两个选择。

  • 使用专门的ssh连接包;例如 如何用python进行ssh连接
  • 解析输出,并在提示后才传递密码。试着调试 os.read 的第一次调用,可能这将澄清不稳定的行为。
© www.soinside.com 2019 - 2024. All rights reserved.