我目前正在编写一个程序,该程序试图联系运行Cisco IOS的多个路由器以获取其当前配置。我正试图使用Paramiko模块的SSHClient
对象来实现这一点:
def get_config(file_path, ip, ip_number):
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(ip, port=22, username="user", password="pw", look_for_keys=False, timeout=None)
stdin,stdout, stderr = ssh.exec_command("show running-config n")
之后,将配置文件写入子文件夹内的特定文件,该子文件夹的名称为变量ip_number
。由于这是在100多个路由器上完成的,我尝试使用线程模块来加快这一过程。当我一次使用更多线程时,我遇到的问题开始更频繁地发生,所以我以这种方式使程序一次只能使用14个线程(服务器运行在14核CPU上):
amount_ip_blocks = int(len(ip_list))/14
if len(ip_list) - 14*amount_ip_blocks != 0:
amount_remaining_ips = len(ip_list) - 14*amount_ip_blocks
for j in range (0, amount_ip_blocks):
threads = []
for i in range (j*14, j*14 + 14):
thread = threading.Thread(target=get_config, args=(path, ip_list[i], i,))
thread.start()
threads.append(thread)
for thread in threads:
thread.join()
最后,对剩余的ip执行相同的操作。
现在,当处理14个ip的第一个块时,这段代码不一致地在不同的线程(并不总是thread-1)上一次给我以下异常0到4次:
Exception in thread Thread-1:
Traceback (most recent call last):
File "D:Program FilesPythonlibthreading.py", line 932, in _bootstrap_inner
self.run()
File "D:Program FilesPythonlibthreading.py", line 870, in run
self._target(*self._args, **self._kwargs)
File "D:location_of_my_programconfig_getter.py", line 99, in get_config
ssh.connect(ip, port=22, username="user", password="pw", look_for_keys=False, timeout=None)
File "D:Program FilesPythonlibsite-packagesparamiko-2.7.2-py3.8.eggparamikoclient.py", line 435, in connect
File "D:Program FilesPythonlibsite-packagesparamiko-2.7.2-py3.8.eggparamikoclient.py", line 691, in _auth
File "D:Program FilesPythonlibsite-packagesparamiko-2.7.2-py3.8.eggparamikoagent.py", line 372, in __init__
AttributeError: module 'paramiko.win_pageant' has no attribute 'can_talk_to_agent'
我试着在网上寻找这个异常,但没能找到任何东西。我也试着研究paramiko的代码,看看它是否对我有任何意义,但无济于事。最后,我尝试调整IP块的大小,较小的块似乎不太经常导致问题,如果发生,它总是在第一个IP块上。经过大量的实验,我无法推断出任何规律。有办法解决这个问题吗?或者在同一程序中使用paramiko同时运行多个SSH连接是不可能的?或者更好的是,有人知道这个问题是怎么发生的吗?
我没有解决方案,但也许是一个变通办法。因为你似乎不使用代理,你试过关闭它吗?
在SSHClient.connect
call中设置allow_agent=False
。