使用 Python 子进程为后续 ssh 命令保持 SSH 连接

Keep SSH connection alive for subsequent ssh command using Python subprocess

我需要通过 运行 shell 命令在我的 python 程序中定期查询远程机器。使用 subprocess.run(["ssh", "MY_SERVER", ....]) 很好,但是我必须通过执行多个 ProxyJump 来访问服务器,这使得初始连接建立非常缓慢。

是否可以先创建到服务器的持久连接,然后发出 shell 命令并通过该管道捕获标准输出?

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

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

读取/写入子进程的示例代码

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)