Paramiko - SSH协议读取错误

2024-05-14 21:02:00 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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


Tags: 代码paramikoerrorprotocolssh用户名私钥banner
3条回答

将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

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

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

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

添加到上面的答案中,建议编辑transport.py:您不必再这样做了。


由于2015年发布的Paramikov.1.15.0(准确地说,this PR)可以在创建Paramiko连接时配置该值,如下所示:

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


在Paramiko的当前版本中,在编写这些单词v.2.7.1时,您还可以在调用connect方法时配置另外两个超时,总共有3个(source):

  • banner_timeout-等待SSH横幅出现的可选超时(秒)。
  • timeout-TCP连接的可选超时(秒)
  • auth_timeout-等待身份验证响应的可选超时(秒)。

相关问题 更多 >

    热门问题