AttributeError: 模块“paramiko.win_pageant”在使用来自 Windows Server 的 Paramiko 进行连接时没有属性“can_talk_to_agent”

问题描述

我目前正在开发一个程序,该程序尝试联系许多运行 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。由于这是通过一百多个路由器完成的,因此我尝试使用线程模块来加快进程。当我一次使用更多线程时,我不断遇到的问题开始更频繁地发生,因此我以这种方式使程序一次仅使用 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 块时,这段代码在不同线程(并不总是线程 1)上同时给我零到四次以下异常:

Exception in thread Thread-1:
Traceback (most recent call last):
File "D:\Program Files\Python\lib\threading.py",line 932,in _bootstrap_inner

self.run()
File "D:\Program Files\Python\lib\threading.py",line 870,in run
self._target(*self._args,**self._kwargs)
File "D:\location_of_my_program\config_getter.py",line 99,in get_config
ssh.connect(ip,timeout=None)
File "D:\Program Files\Python\lib\site-packages\paramiko-2.7.2-py3.8.egg\paramiko\client.py",line 435,in connect
File "D:\Program Files\Python\lib\site-packages\paramiko-2.7.2-py3.8.egg\paramiko\client.py",line 691,in _auth
File "D:\Program Files\Python\lib\site-packages\paramiko-2.7.2-py3.8.egg\paramiko\agent.py",line 372,in __init__
AttributeError: module 'paramiko.win_pageant' has no attribute 'can_talk_to_agent'

我曾尝试在网上查找此异常,但找不到任何内容。我还尝试查看 paramiko 的代码,看看它对我是否有意义,但无济于事。最后,我尝试调整 IP 块的大小,较小的块似乎不太经常导致问题,如果发生,它总是在第一个 IP 块上发生。经过大量实验,我无法推断出任何规律性。 有没有办法解决这个问题?或者根本不可能同时/在同一个程序中使用paramiko运行多个SSH连接? 或者更好的是,有人知道这个问题是如何发生的吗?

解决方法

我没有解决方案,但可能是一种解决方法。由于您似乎没有使用代理,您是否尝试将其关闭?

SSHClient.connect 调用中设置 allow_agent=False