Paramiko 中 ssh over ssh 的 keep alive 机制

Keep alive mechanism for ssh over ssh in Paramiko

我正在使用 Paramiko 交互式 shell(invoke_shell() 方法)在本地主机和远程主机之间打开会话并向其发送命令。
有时我需要从我的远程主机打开到另一个远程主机的 ssh 连接(这就像通过 SSH 从本地主机通过 remote_host_1 到 remote_host_2 的网桥或 SSH)。

为了更好地理解这是一张图片,它应该如何表现:

| local host |  -(1)->    | remote host |  -(2)->   | destination host |   

1: 使用 invoke_shell() paramiko 方法打开,因此它会创建一些 paramiko.Channel 对象。
2: 使用 Linux 命令打开,即 ssh remote_user@remote_ip

这样做是因为有时我与 destination host 没有直接连接,如果您通过 remote host 打开它,则应由用户决定(输入另一个 password ,回答 yes/no 一些问题等等。)

现在我的问题是关于保持我的连接。
我阅读了 paramiko 拥有的 keep_alive 机制,但它并没有按照我的意愿行事,因为 paramiko 知道我的连接结束于 remote_host 而不是 destination host 所以如果 destination host 死了,我将不会收到任何有关它的通知,并且命令执行将失败。

我想到的唯一解决方案是在此通道 (\n) 上发送空命令,并在执行所需命令之前尝试从通道读取输出。但这意味着我一方面可以影响我的频道,而且我的命令执行时间现在是原来的两倍。

现在我的问题是,是否有另一种方法来执行此连接,以便此 keep alive 机制起作用?

p.s。我读到有一些 ServerAliveInterval=30 标志可以帮助我保持 ssh 交互式连接处于活动状态,但我不明白如何使用它来验证它没有死。

正确的做法是使用端口转发实现跳转
参见

然后您将完全控制这两个连接,并且您将能够使用本机 Paramiko 功能来保持连接活动并检查其状态。