【发布时间】:2019-07-02 07:51:56
【问题描述】:
我有一个用例,我需要从主机“A”通过主机“B”和“C”连接到主机“D”(我希望能够将该解决方案应用于尽可能多的中间主机可能):
A==>B==>C==>D
一旦与 D 建立连接,我想运行命令列表 ["comm1", "comm2", "comm3"] 并接收响应为 ["output1", "output2", "output3 "] 在主机 A。 我想出的唯一策略是,一旦你到达主机 D:
- 执行 connection.invoke_shell()
- 发送 comm1,轮询输出通道,收集响应并将其插入到一个空列表中
- 关闭connection.invoke_shell()创建的通道
- 构建全新的交互式 shell 通道
- 对 comm2 和 comm3 重复步骤 1 到 5
当我开发时意识到尝试重新建立交互式 shell 通道将导致 EOFError。我有一种预感,在第 3 步中关闭通道会终止从主机 A 到主机 D 的整个 SSH 会话。
但是,必须关闭通道并为每个命令启动一个新的交互式 shell,否则,您将读取通道的完整输出(包含所有 3 个命令的输出)作为一大块文本,然后您必须使用屏幕抓取进行处理,这并不理想。 上面的算法可行吗?如果是,如何使用 paramiko 实现它,为什么会出现 EOFError 异常?
我也尝试使用 Fabric 来实现这一点。它适用于某些设备,但不适用于思科设备。原因是 Fabric 使用了 paramiko 的 ssh 远程命令执行功能,某些 Cisco 设备也不支持该功能(查看 client.exec_command)。因此,交互式会话是唯一的出路。
【问题讨论】:
标签: paramiko openssh ssh-tunnel