我正在开发一个Ansible手册来从多个网络设备中收集一些事实。我用High Sierra在Mac上测试了我的剧本。我已经认识到Ansible可以仅使用5个设备成功建立SSH会话,其他会话返回错误(最常见的是#34;没有现有的会话")。我在CentOS机器上测试了相同的剧本没有问题。
经过一些故障排除后,我可以将问题缩小到OS X和paramiko。使用一个小的Python脚本,我可以重现这个问题:
import paramiko, os
paramiko.common.logging.basicConfig(level=paramiko.common.DEBUG)
ssh1 = paramiko.SSHClient()
ssh1.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh1.connect("IP address", 22, "username", "password", look_for_keys=False, allow_agent=False)
ssh1.close()
如果我重复运行此脚本,前五次尝试成功,但第六次尝试总是失败并显示错误消息"读取SSH协议标题时出错#34;。
DEBUG:paramiko.transport:starting thread (client mode): 0x1411050L
DEBUG:paramiko.transport:Local version/idstring: SSH-2.0-paramiko_2.4.1
ERROR:paramiko.transport:Exception: Error reading SSH protocol banner
ERROR:paramiko.transport:Traceback (most recent call last):
ERROR:paramiko.transport: File "/Users/xxx/Library/Python/2.7/lib/python/site-packages/paramiko/transport.py", line 1893, in run
ERROR:paramiko.transport: self._check_banner()
ERROR:paramiko.transport: File "/Users/xxx/Library/Python/2.7/lib/python/site-packages/paramiko/transport.py", line 2049, in _check_banner
ERROR:paramiko.transport: 'Error reading SSH protocol banner' + str(e)
ERROR:paramiko.transport:SSHException: Error reading SSH protocol banner
ERROR:paramiko.transport:
Traceback (most recent call last):
File "yy.py", line 6, in <module>
ssh1.connect("IP address", 22, "username", "password", look_for_keys=False, allow_agent=False)
File "/Users/xxx/Library/Python/2.7/lib/python/site-packages/paramiko/client.py", line 392, in connect
t.start_client(timeout=timeout)
File "/Users/xxx/Library/Python/2.7/lib/python/site-packages/paramiko/transport.py", line 545, in start_client
raise e
paramiko.ssh_exception.SSHException: Error reading SSH protocol banner
我已经针对Linux服务器或网络设备测试了这个脚本,症状是一样的。一段时间后,接下来的五次尝试将再次成功。
版本:Mac OS X High Sierra(10.13.5),paramiko:2.4.1
我认为这是OS X中某些低级网络设置的结果。不幸的是,我不是调整OS X网络堆栈的专家,所以任何推荐/评论都会受到高度赞赏。
谢谢和最诚挚的问候, 的Gabor