如何使用Python中paramiko工具批量的查询、管理、配置路由器交换机

Written by

in

文章目录
  • 设备IP保存在同目录下的ips.csv文件中,也可以修改使用txt文档或其他文档格式。 去除重复的IP 登录交换机,执行sys,dis version命令 保存交换机的操作结果到txt文件中,文件名称为hostname_ip_date+time_output.txt
  • 本篇内容均在华三模拟器上实现,脚本旨在学习,练习,不以最终使用为目的,因此尚存在以下问题 假设所有设备使用了相同的用户名和密码。实际中可能需要创建包含用户名密码的配置文件,以适配不同设备有不同的密码。 同上,在脚本中直接使用了用户名,密码,不安全。 直接在脚本中使用了设备指令,不适用于多品牌,多版本等场景,因为不同设备的命令行可能不同。 脚本单台设备顺序执行,如果设备较多,执行设备命令较多,则非常耗时,效率低下。 当设备回显内容太多需要翻页时,信息收集不完整,除非你已关闭了设备上回显翻页。 仅适配了密码登录,不适用于使用密钥管理的设备。 没有循环读取回显,最多读取保存65535行,如果执行了较多的操作,操作记录可能不完整。 如果你所在实际场景设备单一,数量不多,要求不高的情况下,可以自行修改脚本并使用。 警告 如果你要用,请自行结合环境调整修改脚本,检查并确保代码的准确性与安全性,尤其是你在代码中加入具有风险操作指令时,例如增加/删除配置时。
  • 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(‘rn’,”).strip() match = re.search(r'[<[](.*?)[>]]’,output,re.M) sysname = match.group(1) if match else “未知系统” print (“你已成功连接至”, i, “系统名称:”, sysname) #向设备发送指令,可自行编辑修改你要发送的命令 time.sleep (0.1) command.send (“sysn”) command.send (“dis versionn”) 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文件内容如下
  • 用户名密码独立配置文件,以适配不同设备有不同密码的场景。 增加密钥登录功能,以适配使用密钥证书管理的设备。 IP文件增加品牌或设备型号 增加以设备型号命名的独立文件,用于存放不同设备的操作命令,以适配多品牌,多版本的网络场景。 增加异步处理或多线程,提升超大网络的执行效率。 使用SNMP获取设备的一些信息。 使用SNMP获取更多的网络信息,例如网络拓扑。 尝试一个完整的网络巡检功能的脚本。 尝试一个设备功能配置的脚本。 基于安全性,可能尝试操作校检。例如脚本要配置某端口的IP,如果该端口已存在配置,则生成日志并停止操作。 使用netconf管理维护设备。 提升脚本的健壮性。 网络自动化的尝试。 其他,待定。 到此这篇关于如何使用Python中paramiko工具批量的查询、管理、配置路由器交换机的文章就介绍到这了,更多相关python paramiko配置路由器交换机内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客! 您可能感兴趣的文章: Python Paramiko模块中exec_command()和invoke_shell()两种操作区别 Python使用Paramiko库实现SSH管理详解 python的paramiko模块基本用法详解 Python Paramiko上传下载sftp文件及远程执行命令详解 Python远程SSH库Paramiko详细操作 python运维自动化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行,如果执行了较多的操作,操作记录可能不完整。

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

    警告

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

    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('rn','').strip()
        match = re.search(r'[<[](.*?)[>]]',output,re.M)
        sysname = match.group(1) if match else "未知系统"
        print ("你已成功连接至", i, "系统名称:", sysname)
        #向设备发送指令,可自行编辑修改你要发送的命令
        time.sleep (0.1)
        command.send ("sysn")
        command.send ("dis versionn")
        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文件内容如下

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

    到此这篇关于如何使用Python中paramiko工具批量的查询、管理、配置路由器交换机的文章就介绍到这了,更多相关python paramiko配置路由器交换机内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!

    您可能感兴趣的文章:

    • Python Paramiko模块中exec_command()和invoke_shell()两种操作区别
    • Python使用Paramiko库实现SSH管理详解
    • python的paramiko模块基本用法详解
    • Python Paramiko上传下载sftp文件及远程执行命令详解
    • Python远程SSH库Paramiko详细操作
    • python运维自动化Paramiko的实现示例

    站内搜索