【问题标题】:pexpect like functionality for a subprocess in pythonpython中子进程的pexpect类似功能
【发布时间】:2017-05-06 08:22:46
【问题描述】:

我有一个工作代码,可以分块从 ssh 连接的标准输出中检索数据,检查每个块末尾的模式匹配,并通过标准输入发回适当的响应。

ssh = paramiko.SSHClient()
...
transport = ssh.get_transport()
session = transport.open_session()
session.set_combine_stderr(True)
session.get_pty()

stdin = session.makefile('wb', -1)
stdout = session.makefile('rb', -1)

session.exec_command(cmd)

for chunk in iter(lambda: session.recv(9999), ""):

  if re.search('Password: $', chunk):
    stdin.write(sudo_pw + '\n')
    stdin.flush()

  output += chunk

现在我有一个子进程,我使用它在本地执行命令,如下所示:

p = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE, stderr=STDOUT)
(output, err) = p.communicate()

如何实现与分块分析输出并通过标准输入发送适当响应的完全相同的逻辑?我正在寻找不使用 pexpect 的解决方案。

【问题讨论】:

    标签: python subprocess stdout stdin pexpect


    【解决方案1】:

    找到了一个以相同方式工作的解决方案。在 Linux 中,sudo 提示仍然无法被捕获,因为它直接读取和写入检测到的终端设备。 sudo -S 工作得很好。

    master, slave = pty.openpty()
    
    p = Popen(cmd, shell=True, stdout=slave, stdin=slave, stderr=STDOUT)
    
    q = select.poll()
    q.register(master,select.POLLIN)
    
    output = ""
    
    while True:
      if not q.poll(0):
        time.sleep(0.1)
        if p.poll() is not None:
          time.sleep(0.1)
          while q.poll(0):
            chunk = os.read(master, 9999)
            output += chunk
          break
      else:
        chunk = os.read(master, 9999)
        output += chunk
    
        if re.search('Password: $', chunk):
          os.write(master, sudo_pw + '\n')
    
    rc = p.returncode
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-21
      • 1970-01-01
      • 1970-01-01
      • 2020-09-23
      相关资源
      最近更新 更多