我需要通过运行 shell 命令定期在我的 python 程序中对远程机器进行查询。使用 subprocess.run(["ssh", "MY_SERVER", ....]) 没问题,但是我必须通过执行多个 ProxyJump 来访问服务器,这使得初始连接建立非常慢。
是否可以先创建与服务器的持久连接,然后发出 shell 命令并通过该管道捕获标准输出?

请您参考如下方法:

有几种方法可以做到这一点。

  • 保持流程开放。使用 Popen 打开一个 ssh 进程并将其标准输入和输出定义为管道。然后,您可以写入其标准输入并从其标准输出读取。由于您想多次执行此操作,因此不应使用 communicate ,而是使用 write 直接写入进程标准输入和 flush . (见下面一段相同的代码)
  • 在我看来,更好的解决方案是使用 Python ssh 包,例如 https://github.com/paramiko/paramiko/ (或织物 - 通常用于其他目的)。在这里,您可以打开一个 channel ,然后轻松地对其进行写入和读取。

  • 读取/写入子进程的示例代码
    import subprocess 
     
    p = subprocess.Popen("bash", stdin=subprocess.PIPE, stdout = subprocess.PIPE, stderr=subprocess.PIPE) 
     
    p.stdin.write(b"ls\n") 
    p.stdin.flush() 
     
    res = p.stdout.read(100) 
    print(res) 
    


    评论关闭
    IT序号网

    微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!