python - 使用 Python 子进程为后续 ssh 命令保持 SSH 连接处于事件状态

标签 python ssh proxy subprocess

我需要通过运行 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)
    

    关于python - 使用 Python 子进程为后续 ssh 命令保持 SSH 连接处于事件状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62499215/

    相关文章:

    python - 嵌套 python 列表推导式以构建列表列表

    python - 如何执行身份验证以验证 Google 应用内订阅

    python - Python 中的字符串处理

    python - 如何将 Paramiko exec_commmand 作为字符串返回给 python 客户端

    linux - 监听端口putty隧道不工作

    Apache 反向代理: how to forward proxy server's HTTP_HOST

    python - 递归拆分函数

    git - 无法使用别名获取多个 ssh key 以与 BitBucket 一起使用

    docker - 代理背后的 Kubernetes Docker 容器

    javascript - Node.js http 代理重定向