在多跳 SSH 连接上重新建立交互式 shell
Posted
技术标签:
【中文标题】在多跳 SSH 连接上重新建立交互式 shell【英文标题】:re-establishing interractive shell on multi-hop SSH connections 【发布时间】: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)。因此,交互式会话是唯一的出路。
【问题讨论】:
【参考方案1】:为简单起见,考虑无跳的情况:
$ ssh -i key user@host 'echo command; echo control'
command
control
$ ssh -i key user@host 'echo command; echo control' >/dev/null
$ ssh -i key user@host 'echo command; echo 1>&2 control' >/dev/null
control
换句话说,我们有两个输出通道...
【讨论】:
以上是关于在多跳 SSH 连接上重新建立交互式 shell的主要内容,如果未能解决你的问题,请参考以下文章