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

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

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

脚本实现

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

脚本缺点

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

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

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

警告

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

脚本内容

PY 复制代码
import paramiko
import time
import csv
import 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配置文件...")
with open(IPS_FILE, "r", encoding="utf-8") as f:
    reader = csv.reader(f)
    for row in reader:
        if not row or row[0].strip().startswith("#"):
            continue
        ip.append(row[0].strip())
set_ip = set(ip)
if len(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) if match else "未知系统"
    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")
    with open(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文件内容如下

相关推荐
TechWayfarer4 分钟前
IP归属地运营商生产落地进阶:缓存+降级+灰度对账全解析
网络·python·网络协议·tcp/ip·缓存
gmaajt5 分钟前
JavaScript中闭包对垃圾回收器GC标记清除算法的影响
jvm·数据库·python
津津有味道8 分钟前
Python定时器读取NFC标签内NDEF网址模拟键盘输出URL并打开Web网页,支持Ubunt、统信、麒麟等国产Linux系统
python·网址·定时器·网页·nfc·uri·读写ini配置
微学AI9 分钟前
Claude-Code-python 前端改造项目工作流程详解
开发语言·前端·python
m0_4954964111 分钟前
C#怎么操作音频文件 C#如何用NAudio播放录制和处理WAV MP3音频文件【工具】
jvm·数据库·python
WL_Aurora13 分钟前
Python 算法基础篇之什么是算法
python·算法
乐世东方客20 分钟前
Nacos-2.1.0问题-自己记录
开发语言·python
AI技术增长24 分钟前
Pytorch图像去噪实战(二):用UNet解决DnCNN细节丢失问题(结构解析+完整代码+踩坑总结)
人工智能·pytorch·python
dFObBIMmai44 分钟前
CSS如何检测页面浮动元素位置_使用审查工具与clear
jvm·数据库·python
qq_460978401 小时前
实现 Svelte 中基于数组索引的 details 元素单开单关交互
jvm·数据库·python