当前位置:首页>python>【练习版】使用Python中paramiko工具批量的查询,管理,配置路由器交换机

【练习版】使用Python中paramiko工具批量的查询,管理,配置路由器交换机

  • 2026-08-26 01:17:20
【练习版】使用Python中paramiko工具批量的查询,管理,配置路由器交换机

本篇文章主要记录在学习过程中,使用paramiko小批量管理路由器交换机的练习,循序渐进的理解paramiko这个工具和代码运用。

实现登录多台交换机,获取设备的hostname,执行简单的查询交换机版本命令,并将查询信息保存到txt文件中。

一、脚本实现

  1. 1. 设备IP保存在同目录下的ips.csv文件中,也可以修改使用txt文档或其他文档格式。
  2. 2. 去除重复的IP
  3. 3. 登录交换机,执行sys,dis version命令
  4. 4. 保存交换机的操作结果到txt文件中,文件名称为hostname_ip_date+time_output.txt

二、脚本缺点

本篇内容均在华三模拟器上实现,脚本旨在学习,练习,不以最终使用为目的,因此尚存在以下问题

  1. 1. 假设所有设备使用了相同的用户名和密码。实际中可能需要创建包含用户名密码的配置文件,以适配不同设备有不同的密码。
  2. 2. 同上,在脚本中直接使用了用户名,密码,不安全。
  3. 3. 直接在脚本中使用了设备指令,不适用于多品牌,多版本等场景,因为不同设备的命令行可能不同。
  4. 4. 脚本单台设备顺序执行,如果设备较多,执行设备命令较多,则非常耗时,效率低下。
  5. 5. 当设备回显内容太多需要翻页时,信息收集不完整,除非你已关闭了设备上回显翻页。
  6. 6. 仅适配了密码登录,不适用于使用密钥管理的设备。
  7. 7. 没有循环读取回显,最多读取保存65535行,如果执行了较多的操作,操作记录可能不完整。

如果你所在实际场景设备单一,数量不多,要求不高的情况下,可以自行修改脚本并使用。

警告

如果你要用,请自行结合环境调整修改脚本,检查并确保代码的准确性与安全性,尤其是你在代码中加入具有风险操作指令时,例如增加/删除配置时。

三、脚本内容

import paramikoimport timeimport csvimport os# 确认当前脚本所在目录,并构建ips.csv文件的路径BASE_DIR = os.path.dirname(os.path.abspath(__file__))IPS_FILE = os.path.join(BASE_DIR, "ips.csv")# 读取IP地址列表,忽略空行和#开头的行,并去除重复的IP地址ip = []print ("正在读取IP配置文件...")withopen(IPS_FILE, "r", encoding="utf-8") as f:    reader = csv.reader(f)for row in reader:ifnot row or row[0].strip().startswith("#"):continue        ip.append(row[0].strip())set_ip = set(ip)iflen(set_ip) == len(ip):print ("读取到的IP地址列表,共", len(ip), "个IP地址,没有重复的IP地址")else:    count_duplicates = len(ip) - len(set_ip)    ip = list(set_ip)print (f"读取到的IP地址列表,共{len(ip)}个IP地址,有{count_duplicates}个重复的IP地址,已自动去重")username = "hao"password = "admin12345"ssh_client = paramiko.SSHClient ()ssh_client.set_missing_host_key_policy (paramiko.AutoAddPolicy ())for i in ip:print ("正在连接至", i)    ssh_client.connect (        hostname=i,username=username,password=password,        look_for_keys=False,allow_agent=False        )    command = ssh_client.invoke_shell ()import re    time.sleep(1.5)    output = command.recv(65535).replace(b'\x00',b'').decode('ASCII').replace('\r\n','').strip()match = re.search(r'[<\[](.*?)[>\]]',output,re.M)    sysname = match.group(1) ifmatchelse"未知系统"print ("你已成功连接至", i, "系统名称:", sysname)#向设备发送指令,可自行编辑修改你要发送的命令    time.sleep (0.1)    command.send ("sys\n")    command.send ("dis version\n")    time.sleep (0.5)    output_text = command.recv(65535).decode('ASCII').replace('\r','').replace('\x00','')print (output_text)# 保存回显结果到TXT文件    filename = os.path.join(BASE_DIR, f"[{sysname}]_{i}_{time.strftime('%Y%m%d%H%M%S')}_output.txt")withopen(filename, 'w', encoding='utf-8') as f:        f.write(f"交换机IP: {i} 系统名称:{sysname}\n")        f.write("=" * 50 + "\n")        f.write(output)        f.write(output_text)        f.write("\n" + "=" * 50 + "\n")        f.write(f"检查时间: {time.strftime('%Y-%m-%d %H:%M:%S')}")print(f"回显结果已保存到文件: {filename}")    ssh_client.close ()print ("已关闭", i, "的连接")print ("---------------------------------------------------------------")print  ("================================================================")print ("检查结束")

四、执行结果

IP文件内容如下,脚本会忽略空行和以#开头的行:

执行脚本可以看到如下信息

生成了相应的txt文件

保存的txt文件内容如下

五、持续学习与改进计划

  1. 1. 用户名密码独立配置文件,以适配不同设备有不同密码的场景。
  2. 2. 增加密钥登录功能,以适配使用密钥证书管理的设备。
  3. 3. IP文件增加品牌或设备型号
  4. 4. 增加以设备型号命名的独立文件,用于存放不同设备的操作命令,以适配多品牌,多版本的网络场景。
  5. 5. 增加异步处理或多线程,提升超大网络的执行效率。
  6. 6. 使用SNMP获取设备的一些信息。
  7. 7. 使用SNMP获取更多的网络信息,例如网络拓扑。
  8. 8. 尝试一个完整的网络巡检功能的脚本。
  9. 9. 尝试一个设备功能配置的脚本。
  10. 10. 基于安全性,可能尝试操作校检。例如脚本要配置某端口的IP,如果该端口已存在配置,则生成日志并停止操作。
  11. 11. 使用netconf管理维护设备。
  12. 12. 提升脚本的健壮性。
  13. 13. 网络自动化的尝试。
  14. 14. 其他,待定。

最新文章

随机文章