Paramiko从连接对象获取stdout(不是exec_command)

时间:2016-04-12 14:23:28

标签: python ssh paramiko

我正在编写一个脚本,它使用paramiko ssh到几个远程主机上并运行一些检查。有些主机被设置为其他人的故障转移,在我尝试连接之前,我无法确定哪个主机正在使用。连接到其中一个“非活动”主机后,主机将通知我您需要连接到另一个“活动”IP,然后在n秒后关闭连接。这似乎写入SSH连接/会话的标准输出(即它不是SSH标题)。

我已经使用了很多paramiko,但是我不知道如何从连接中获取此输出,exec_command显然会给我stdout和stderr,但主机在连接时立即输出,并且它不接受任何其他传入的请求/消息。它只在n秒后关闭。

我不想等到超时才能进入下一个主机并且我也想验证这是无法连接和运行检查的原因,否则我的脚本按预期工作

非常感谢任何关于如何捕获此输出的建议,无论是否有paramiko,都非常感激。

1 个答案:

答案 0 :(得分:0)

我想出了一种获取数据的方法,说实话,这是非常直接的,虽然有点hackish。这在其他情况下可能不起作用,特别是如果存在延迟,但我也可能误解了发生的事情:

当连接打开时,服务器会发出两条消息,一条消息说它无法访问特定目录,然后几毫秒后它会发出另一条消息,指出您需要连接到另一条IP。如果我在连接后立即发送命令(并不重要的是什么命令),exec_command会将第二条消息解释为响应。所以现在我有一个解决我的问题的方法,因为我可以检查这个字符串是否有已知消息并改变执行流程。

但是,如果我所描述的是准确的,那么这可能不适用于存在太多延迟和“测试”的情况。在收到服务器响应之前,不会发送命令。

据我所知(我可能非常错误),目前没有正确的方法在打开与paramiko的连接后立即获取stdout流。如果有人知道某种方式,请告诉我。