属性错误:从 Windows Server 使用 Paramiko 进行连接时,模块“paramiko.win_pageant”没有属性“can_talk_to_agent”

问题描述 投票:0回答:1

我目前正在开发一个程序,该程序尝试联系众多运行 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, port=22, username="user", password="pw", look_for_keys=False, 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 连接? 或者更好的是,有人知道这个问题是如何发生的吗?

python multithreading ssh paramiko ssh-agent
1个回答
1
投票

我没有解决方案,但也许有一个解决方法。由于您似乎没有使用Agent,您是否尝试将其关闭?

allow_agent=False
通话中设置
SSHClient.connect

© www.soinside.com 2019 - 2024. All rights reserved.