在Paramiko中通过ssh保持ssh的存活机制

问题描述 投票:1回答:1

我正在使用Paramiko交互式shell(invoke_shell()方法)在本地主机和远程主机之间打开会话并向其发送命令。有时,我需要从远程主机打开到另一个远程主机的ssh连接(这就像从本地主机通过remote_host_1通过SSH通过SSH桥接或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机制将起作用吗?

ps.s。我了解到存在一些ServerAliveInterval=30标志可以帮助我保持ssh交互式连接的活动,但是我不知道如何使用它来验证它没有失效。

python ssh paramiko tunnel
1个回答
1
投票

正确的方法是使用端口转发来实现跳转。参见Connecting to a server via another server using Paramiko

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

© www.soinside.com 2019 - 2024. All rights reserved.