ssh多路复用&python:它会这样工作吗?

2024-10-03 11:19:35 发布

您现在位置:Python中文网/ 问答频道 /正文

先决条件:

  • 我希望通过ssh从python一次在一台远程机器上执行dyamic多个命令
  • 我找不到任何与我的“风格”匹配的现有模块(如果您关心原因,请参阅下文(*);)
  • Python脚本在Ubuntu机器上本地运行

一般来说,对于单个“单操作调用”,我只需使用subprocess.Popen执行本机ssh调用,效果很好

但是对于多个后续动态调用,我不想为每个命令创建新的ssh连接,即使远程主机可能允许。我想到了以下解决方案:

1)在Ubuntu上配置我的本地ssh以使用多路复用,因此只要连接打开,就会使用它,而不是创建新的连接(https://www.admin-magazin.de/News/Tipps/Mit-SSH-Multiplexing-schneller-einloggen(对不起,德语))

2)通过在运行的后台线程中打开ssh连接来创建ssh连接,在后台线程中,除了必要的“keepalive”或诸如此类的操作之外,什么都不做,并保持连接打开直到关闭(即停止线程)。(http://sebastiandahlgren.se/2014/06/27/running-a-method-as-a-background-thread-in-python/

3)仍然只通过subprocess.Popen执行ssh调用,但由于ssh多路复用配置,现在自动使用开放连接

这是可行的,还是存在谬误警报


(*)我不想要的:

  • 我发现的大多数解决方案/示例都使用paramiko。在我的第一条“快乐之路”中,它工作得很有魅力,但第一次失败测试导致了内部AttributeError(https://github.com/paramiko/paramiko/issues/1617),我不想在此基础上构建任何东西
  • 我发现的其他LIB,例如,似乎没有真正的社区使用它们
  • peexpect…整个“expect”概念让我毛骨悚然,我认为只有在绝对没有其他合理理由的情况下才应该使用它;)

Tags: https命令机器paramiko远程风格先决条件ubuntu
1条回答
网友
1楼 · 发布于 2024-10-03 11:19:35

您的建议很好,但您甚至不需要在后台线程中保持ssh连接的运行。如果配置ControlMaster(用于重用现有连接)和ControlPerist(用于在所有其他连接都已关闭时保持主连接打开),则新的ssh连接将继续使用共享连接(只要它们发生在ControlPersist超时之前)

这意味着,如果您在代码外部设置了ControlMaster配置(例如,在~/.ssh/ssh_config),您的代码甚至不需要知道配置:它可以继续正常调用ssh,并且ssh将负责重用连接

相关问题 更多 >