【发布时间】:2020-06-14 07:54:08
【问题描述】:
我正在使用 Paramiko 交互式 shell(invoke_shell() 方法)打开本地主机和远程主机之间的会话并向其发送命令。
有时我需要从我的远程主机打开到另一个远程主机的 ssh 连接(这就像通过 SSH 从本地主机到 remote_host_2 通过 remote_host_1 的桥或 SSH)。
为了更好地理解这是一张应该如何表现的图片:
| local host | -(1)-> | remote host | -(2)-> | destination host |
1: 使用 invoke_shell() paramiko 方法打开,因此它将创建一些 paramiko.Channel obj。
2: 使用 Linux 命令打开,即ssh remote_user@remote_ip
这样做是因为有时我与destination host 没有直接联系,如果您通过remote host 打开它,那么应该做出用户决定(输入另一个password,回答yes/no 一些问题等等。)
现在我的问题是关于保持连接有效。
我阅读了keep_alive 机制,paramiko 具有但它没有做我想要的,因为paramiko 知道我的连接结束于remote_host 而不是destination host,所以万一destination host 死了我不会收到有关它的任何通知,命令执行将失败。
我想到的唯一解决方案是在此通道 (\n) 上发送空命令,并尝试在执行所需命令之前从通道读取输出。但这意味着我一方面可以影响我的频道,而且我的命令执行时间现在是原来的两倍。
现在我的问题是,是否有另一种方法来执行此连接,以使这种 keep alive 机制起作用?
附言我读到有一些ServerAliveInterval=30 标志可以帮助我保持ssh 交互式连接处于活动状态,但我不明白如何使用它来验证它没有死。
【问题讨论】:
标签: python ssh paramiko tunnel