在多跳 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的主要内容,如果未能解决你的问题,请参考以下文章

如何自动输入密码ssh连接到其他机器

用ssh工具连接linux时出现以下报错代码,但是有时候有能连接上,不知神马原因,请各位神友指教指教 谢谢

paramiko实现SSH交互式命令执行

如何使用织物进行多跳 ssh

带有密码提示 C# 的多跳 SSH 问题

没有显示器如何SSH连接上树莓派