我正在使用paramiko交互式shell(invoke_shell()
方法)在本地主机和远程主机之间打开会话并向其发送命令。有时,我需要从远程主机打开到另一个远程主机的ssh连接(这就像从本地主机通过remote_host_1通过SSH通过SSH桥接或SSH)。
为了更好地理解,这是图片的表现方式:
|本地主机| -(1
)-> |远程主机| -(2
)-> |目的地主机|
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机制将起作用吗?
ps.s。我了解到存在一些ServerAliveInterval=30
标志可以帮助我保持ssh
交互式连接的活动,但是我不知道如何使用它来验证它没有失效。
正确的方法是使用端口转发来实现跳转。参见Connecting to a server via another server using Paramiko
然后,您将完全控制两个连接,并且可以使用Paramiko的本机功能保持连接活动并检查其状态。