最近,我制作了一个基于paramiko连接到具有不同用户名(感谢私钥)的工作站的代码。
我从来没有遇到任何问题,但今天,我有:SSHException: Error reading SSH protocol banner
这很奇怪,因为它在任何连接上都是随机发生的。有没有办法解决它?
答案 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)
在写这些字词时,在connect
方法时,您还可以配置2个超时,总计这3个(source):
banner_timeout
-等待SSH标语显示的可选超时(以秒为单位)。timeout
-TCP连接的可选超时(以秒为单位)auth_timeout
-等待身份验证响应的可选超时(以秒为单位)。答案 3 :(得分:0)
paramiko 似乎在我将不存在的文件名传递给 kwargs
>key_filename
时引发此错误。我敢肯定还有其他情况会无意义地引发此异常。