找回密码
 立即注册
首页 业界区 业界 【练习版】使用paramiko批量的查询,管理,配置路由器交 ...

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

掳诚 前天 07:00
本篇文章主要记录在学习过程中,使用paramiko小批量管理路由器交换机的练习,循序渐近的理解paramiko这个工具和代码运用。
实现登录多台交换机,获取设备的hostname,执行简单的查询交换机版本命令,并将查询信息保存到txt文件中。
一、脚本实现


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

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

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

如果你要用,请自行结合环境调整修改脚本,检查并确保代码的准确性与安全性,尤其是你在代码中加入具有风险操作指令时,例如增加/删除配置时。
三、脚本内容
  1. import paramiko
  2. import time
  3. import csv
  4. import os
  5. # 确认当前脚本所在目录,并构建ips.csv文件的路径
  6. BASE_DIR = os.path.dirname(os.path.abspath(__file__))
  7. IPS_FILE = os.path.join(BASE_DIR, "ips.csv")
  8. # 读取IP地址列表,忽略空行和#开头的行,并去除重复的IP地址
  9. ip = []
  10. print ("正在读取IP配置文件...")
  11. with open(IPS_FILE, "r", encoding="utf-8") as f:
  12.     reader = csv.reader(f)
  13.     for row in reader:
  14.         if not row or row[0].strip().startswith("#"):
  15.             continue
  16.         ip.append(row[0].strip())
  17. set_ip = set(ip)
  18. if len(set_ip) == len(ip):
  19.     print ("读取到的IP地址列表,共", len(ip), "个IP地址,没有重复的IP地址")
  20. else:
  21.     count_duplicates = len(ip) - len(set_ip)
  22.     ip = list(set_ip)
  23.     print (f"读取到的IP地址列表,共{len(ip)}个IP地址,有{count_duplicates}个重复的IP地址,已自动去重")
  24. username = "hao"
  25. password = "admin12345"
  26. ssh_client = paramiko.SSHClient ()
  27. ssh_client.set_missing_host_key_policy (paramiko.AutoAddPolicy ())
  28. for i in ip:
  29.     print ("正在连接至", i)
  30.     ssh_client.connect (
  31.         hostname=i,username=username,password=password,
  32.         look_for_keys=False,allow_agent=False
  33.         )
  34.     command = ssh_client.invoke_shell ()
  35.    
  36.     import re
  37.     time.sleep(1.5)
  38.     output = command.recv(65535).replace(b'\x00',b'').decode('ASCII').replace('\r\n','').strip()
  39.     match = re.search(r'[<\[](.*?)[>\]]',output,re.M)
  40.     sysname = match.group(1) if match else "未知系统"
  41.     print ("你已成功连接至", i, "系统名称:", sysname)
  42.     #向设备发送指令,可自行编辑修改你要发送的命令
  43.     time.sleep (0.1)
  44.     command.send ("sys\n")
  45.     command.send ("dis version\n")
  46.     time.sleep (0.5)
  47.     output_text = command.recv(65535).decode('ASCII').replace('\r','').replace('\x00','')
  48.     print (output_text)
  49.     # 保存回显结果到TXT文件
  50.     filename = os.path.join(BASE_DIR, f"[{sysname}]_{i}_{time.strftime('%Y%m%d%H%M%S')}_output.txt")
  51.     with open(filename, 'w', encoding='utf-8') as f:
  52.         f.write(f"交换机IP: {i} 系统名称:{sysname}\n")
  53.         f.write("=" * 50 + "\n")
  54.         f.write(output)
  55.         f.write(output_text)
  56.         f.write("\n" + "=" * 50 + "\n")
  57.         f.write(f"检查时间: {time.strftime('%Y-%m-%d %H:%M:%S')}")
  58.     print(f"回显结果已保存到文件: {filename}")
  59.     ssh_client.close ()
  60.     print ("已关闭", i, "的连接")
  61.     print ("---------------------------------------------------------------")
  62. print  ("================================================================")
  63. print ("检查结束")
复制代码
四、执行结果

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

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

生成了相应的txt文件
3.png

保存的txt文件内容如下
4.png

五、持续学习与改进计划


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

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册