Paramiko:阅读SSH协议横幅时出错

时间:2014-09-01 15:36:23

标签: python paramiko

最近,我制作了一个基于paramiko连接到具有不同用户名(感谢私钥)的工作站的代码。

我从来没有遇到任何问题,但今天,我有:SSHException: Error reading SSH protocol banner

这很奇怪,因为它在任何连接上都是随机发生的。有没有办法解决它?

4 个答案:

答案 0 :(得分:20)

这取决于你的意思"修复"。正如评论中指出的那样,根本原因是拥挤/缺乏资源。这样,它与某些HTTP代码类似。这是正常原因,可能是ssh服务器返回错误的标头数据。

429太多请求,告诉客户端使用速率限制,或者如果超出配额,API有时会以类似的方式返回503。这个想法是,稍后再试,延迟。

您可以尝试在代码中处理此异常,稍等片刻,然后重试。您还可以编辑transport.py文件,将横幅超时设置为更高的值。如果您的应用程序与服务器响应的速度并不重要,您可以将其设置为60秒。

答案 1 :(得分:2)

当将transport.py文件中的超时值(如TinBane所述)从15更改为更高时,此问题得到部分解决。在#484行:

self.banner_timeout = 200 # It was 15

但是,要永久解决该问题,我在transport.py上添加了一条静态行,以在_check_banner(self):函数中声明新的更高的值。

以下是具体变化:

  • 是这样的:

 def _check_banner(self):
        for i in range(100):
            if i == 0:
                timeout = self.banner_timeout
            else:
                timeout = 2
  • 永久更改如下:

 def _check_banner(self):
        for i in range(100):
            if i == 0:
                timeout = self.banner_timeout
                timeout = 200 # <<<< Here is the explicit declaration 
            else:
                timeout = 2

答案 2 :(得分:0)

在上述答案的基础上,建议编辑transport.py:您不必再这样做了。


自Paramiko 起。 1.15.0 (2015年发布,确切地说是this PR),您可以在创建Paramiko连接时配置该值,如下所示:

client = SSHClient()
client.connect('ssh.example.com', banner_timeout=200)


在写这些字词时,在当前版本的Paramiko中, v。 2.7.1 ,在调用connect方法时,您还可以配置2个超时,总计这3个(source):

  • banner_timeout-等待SSH标语显示的可选超时(以秒为单位)。
  • timeout-TCP连接的可选超时(以秒为单位)
  • auth_timeout-等待身份验证响应的可选超时(以秒为单位)。

答案 3 :(得分:0)

paramiko 似乎在我将不存在的文件名传递给 kwargs>key_filename 时引发此错误。我敢肯定还有其他情况会无意义地引发此异常。