当前位置:网站首页 > 网络设备调试 正文 网络设备调试

用python对华为交换机进行远程巡检并输出文件

frank 2025-09-01 22:19:33 网络设备调试 1 ℃ 0 评论

1.编写代码
用python对华为交换机进行远程巡检并输出文件

2.编写存放IP的txt,并命名为“ip_list1.txt”

用python对华为交换机进行远程巡检并输出文件

3.确定密码,并更改
用python对华为交换机进行远程巡检并输出文件

4.确定输出文件存放位置及名称

用python对华为交换机进行远程巡检并输出文件

 

5.将不能连接的IP输出到“ip_unreachable.txt”

用python对华为交换机进行远程巡检并输出文件

6.记录无法连接设备的原因并写入到excel
用python对华为交换机进行远程巡检并输出文件


7.确认巡检内容

需要包含:软件版本、CPU利用率、内存利用率、硬件状态、风扇状态

用python对华为交换机进行远程巡检并输出文件

8.运行时显示进度和耗时

用python对华为交换机进行远程巡检并输出文件
用python对华为交换机进行远程巡检并输出文件

9.运行

运行状态

用python对华为交换机进行远程巡检并输出文件

用python对华为交换机进行远程巡检并输出文件

运行结果

用python对华为交换机进行远程巡检并输出文件

用python对华为交换机进行远程巡检并输出文件

用python对华为交换机进行远程巡检并输出文件

用python对华为交换机进行远程巡检并输出文件


10.以下为代码内容,可直接复制使用,并按需更改

# -*- coding: utf-8 -*-
# 声明代码采用的字符编码格式为UTF-8,用于支持中文等多字符集的正确处理

from netmiko.huawei.huawei import HuaweiSSH
# 从netmiko库的huawei子模块中导入HuaweiSSH类,用于建立与华为设备的SSH连接
from netmiko import NetMikoTimeoutException
# 导入NetMikoTimeoutException异常类,用于捕获连接华为设备时超时的异常情况
from netmiko import NetMikoAuthenticationException
# 导入NetMikoAuthenticationException异常类,用于捕获连接华为设备时认证失败的异常情况
import re
# 导入re模块,用于使用正则表达式进行字符串的匹配和提取操作
import xlwt
# 导入xlwt库,用于创建和操作Excel文件(写入数据等)
from datetime import datetime
# 导入datetime类,用于获取当前时间相关信息

#import getpass
#需要交互输入账号密码时可以使用

def parse_version_info(cmd_result, hang, worksheet, lie):
    """
    解析设备版本信息命令结果,提取出版本号并写入Excel工作表
    :param cmd_result: 命令执行返回的结果字符串
    :param hang: 当前要写入数据的Excel工作表行索引
    :param worksheet: 要写入数据的Excel工作表对象
    :param lie: 当前要写入数据的Excel工作表列索引
    :return: 更新后的列索引
    """
    if 'VRP (R) software' in cmd_result:
        regex_str = r'\(R\) software, Version (.*)'
        version = re.search(regex_str, cmd_result)
        if version:
            lie = lie + 1
            worksheet.write(hang, lie, label=version.group(1).strip())
    return lie

def parse_cpu_usage_info(cmd_result, hang, worksheet, lie):
    """
    解析CPU使用率命令结果,提取出使用率数值并写入Excel工作表
    :param cmd_result: 命令执行返回的结果字符串
    :param hang: 当前要写入数据的Excel工作表行索引
    :param worksheet: 要写入数据的Excel工作表对象
    :param lie: 当前要写入数据的Excel工作表列索引
    :return: 更新后的列索引
    """
    if 'CPU ' in cmd_result:
        regex_str = r'\d*.\d*.\%'
        cpu_usage = re.search(regex_str, cmd_result)
        if cpu_usage:
            lie = lie + 1
            worksheet.write(hang, lie, label=cpu_usage.group().strip())
    return lie

def parse_memory_usage_info(cmd_result, hang, worksheet, lie):
    """
    解析内存使用率命令结果,提取出使用率数值并写入Excel工作表
    :param cmd_result: 命令执行返回的结果字符串
    :param hang: 当前要写入数据的Excel工作表行索引
    :param worksheet: 要写入数据的Excel工作表对象
    :param lie: 当前要写入数据的Excel工作表列索引
    :return: 更新后的列索引
    """
    if 'Memory ' in cmd_result:
        regex_str = r'\d+%'
        memory = re.search(regex_str, cmd_result)
        if memory:
            lie = lie + 1
            worksheet.write(hang, lie, label=memory.group())
    return lie

def parse_device_status_info(cmd_result, hang, worksheet, lie):
    """
    解析设备硬件状态命令结果,根据结果中的关键字判断硬件状态并写入Excel工作表
    :param cmd_result: 命令执行返回的结果字符串
    :param hang: 当前要写入数据的Excel工作表行索引
    :param worksheet: 要写入数据的Excel工作表对象
    :param lie: 当前要写入数据的Excel工作表列索引
    :return: 更新后的列索引
    """
    if 'Device ' in cmd_result:
        if 'Abnormal' in cmd_result:
            lie = lie + 1
            worksheet.write(hang, lie, label="Abnormal")
        elif 'WrongType' in cmd_result:
            lie = lie + 1
            worksheet.write(hang, lie, label="WrongType")
        elif 'Unregistered' in cmd_result:
            lie = lie + 1
            worksheet.write(hang, lie, label="Unregistered")
        elif 'Off' in cmd_result:
            lie = lie + 1
            worksheet.write(hang, lie, label="Off")
        elif 'Offline' in cmd_result:
            lie = lie + 1
            worksheet.write(hang, lie, label="Offline")
        else:
            lie = lie + 1
            worksheet.write(hang, lie, label="Normal")
    return lie

def parse_fan_status_info(cmd_result, hang, worksheet, lie):
    """
    解析设备风扇状态命令结果,根据结果中的关键字判断风扇状态并写入Excel工作表
    :param cmd_result: 命令执行返回的结果字符串
    :param hang: 当前要写入数据的Excel工作表行索引
    :param worksheet: 要写入数据的Excel工作表对象
    :param lie: 当前要写入数据的Excel工作表列索引
    :return: 更新后的列索引
    """
    if 'FanID' in cmd_result:
        if 'Normal' in cmd_result:
            lie = lie + 1
            worksheet.write(hang, lie, label="Normal")
        else:
            lie = lie + 1
            worksheet.write(hang, lie, label="Abnormal")
    return lie

def main():
    """
        主函数
    """
    # 记录开始时间
    start_time = datetime.now()
    # 固定输入ssh用户名密码
    username = 'admin'
    password = 'Huawei@123'
    # 定义用于连接华为设备的SSH用户名和密码,此处为固定值

    # 请用户输入ssh用户名密码
    #username = input('Username:')
    #password = getpass.getpass('Password:')

    # 打开ip_list.txt文件获取IP列表
    with open('ip_list1.txt', 'r') as ip_list:
        ip_addr = [ip.strip() for ip in ip_list.readlines()]
    # 以只读模式打开名为ip_list.txt的文件,读取其中每一行的IP地址信息,去除每行的空白字符(如换行符等)后存储到ip_addr列表中

    cmd_line = ['display version', 'display cpu-usage', 'display memory-usage', 'display device', 'display fan']
    # 定义一个命令列表,包含了要发送给华为设备用于获取设备相关信息的命令,如版本信息、CPU使用率、内存使用率、设备状态以及风扇状态等

    # 创建一个workbook 设置编码
    workbook = xlwt.Workbook(encoding='utf-8')
    # 创建一个新的Excel工作簿对象,设置其编码格式为UTF-8,以支持多种字符的正确写入
    # 创建一个worksheet
    worksheet = workbook.add_sheet('My Worksheet')
    # 在创建好的工作簿中添加一个名为'My Worksheet'的工作表
    # 初始化表格
    worksheet.write(0, 0, label="交换机IP")
    worksheet.write(0, 1, label="交换机名称")
    worksheet.write(0, 2, label="软件版本")
    worksheet.write(0, 3, label="CPU利用率")
    worksheet.write(0, 4, label="内存利用率")
    worksheet.write(0, 5, label="硬件状态")
    worksheet.write(0, 6, label="风扇状态")
    # 在工作表的第一行(索引为0)的各个列(索引分别为0到6)写入对应的表头信息,用于标识后续要填入的设备相关数据内容
    hang = 0
    lie = 0
    # 初始化两个变量hang(行)和lie(列),用于后续在Excel工作表中定位写入数据的位置,初始值都设为0

    # 获取当前时间并格式化为字符串,用于文件名
    current_time = datetime.now().strftime('%Y%m%d%H%M%S')
    output_file_name = f"{current_time}_巡检.xls"
    save_path = r"G:\巡检" + "\\" + output_file_name
    # 拼接生成最终要保存的Excel文件的完整路径和文件名,文件名包含当前时间信息及固定的后缀名".xls"

    # 用于记录无法连接的IP地址
    unconnected_ips = []

    total_count = len(ip_addr)
    inspected_count = 0
    # 遍历ip列表用来生成迭代器
    for index, ip in enumerate(ip_addr):
        print(' ')
        print('本次巡检的设备IP:' + ip)
        inspected_count += 1
        # 每巡检10台设备打印一次进度
        if inspected_count % 10 == 0:
            remaining_count = total_count - inspected_count
            print(f"共巡检 {total_count} 台,已巡检 {inspected_count} 台,未巡检 {remaining_count} 台")
        try:
            device_info = {
                'device_type': 'huawei',
                'ip': ip,
                'username': username,
                'password': password,
                "conn_timeout": 15,
            }
            # 创建一个字典device_info,用于存放连接华为设备所需的信息,包括设备类型(指定为华为)、IP地址、用户名和密码
            # 实例化HuaweiSSH
            net_connect = HuaweiSSH(**device_info)
            # 使用之前定义的device_info字典中的信息,实例化HuaweiSSH类,建立与对应IP地址的华为设备的SSH连接
            ip_str = ip
            hang = hang + 1
            # 将当前遍历到的IP地址赋值给ip_str变量,方便后续使用,同时将行索引hang加1,用于在Excel工作表中定位到下一行准备写入当前设备的数据
            # 初始化表格列
            lie = 0
            worksheet.write(hang, lie, label=ip_str)
            # 获取交换机名称,并优化处理
            switch_name = net_connect.find_prompt().strip('<>')
            if not switch_name:
                switch_name = "未知设备"
            lie = lie + 1
            worksheet.write(hang, lie, label=switch_name)
            for cmd in cmd_line:
                cmd_result = net_connect.send_command(cmd)
                # 调用不同的解析函数处理各命令结果
                if cmd == 'display version':
                    lie = parse_version_info(cmd_result, hang, worksheet, lie)
                elif cmd == 'display cpu-usage':
                    lie = parse_cpu_usage_info(cmd_result, hang, worksheet, lie)
                elif cmd == 'display memory-usage':
                    lie = parse_memory_usage_info(cmd_result, hang, worksheet, lie)
                elif cmd == 'display device':
                    lie = parse_device_status_info(cmd_result, hang, worksheet, lie)
                elif cmd == 'display fan':
                    lie = parse_fan_status_info(cmd_result, hang, worksheet, lie)
                cmd_result = ''
            net_connect.disconnect()
            # 完成对当前设备的所有命令执行和数据采集后,断开与该设备的SSH连接
        except (EOFError, NetMikoTimeoutException):
            print('无法连接设备')
            unconnected_ips.append(ip)
            netmikotimeout = '无法连接设备' + ip
            hang = hang + 1
            lie = 0
            worksheet.write(hang, lie, label=netmikotimeout)
            # 如果捕获到EOFError或者NetMikoTimeoutException异常,说明连接设备出现超时等问题,将该IP记录到无法连接列表中,打印提示信息,在Excel工作表的下一行(hang加1)、第一列(lie初始为0)写入相应的错误提示信息,记录该设备无法连接的情况
        except (EOFError, NetMikoAuthenticationException):
            print('用户名密码错误!')
            netmikotauthentication = '用户名密码错误' + ip
            hang = hang + 1
            lie = 0
            worksheet.write(hang, lie, label=netmikotauthentication)
            # 如果捕获到EOFError或者NetMikoAuthenticationException异常,说明连接设备时用户名或密码错误,打印提示信息,在Excel工作表的下一行(hang加1)、第一列(lie初始为0)写入相应的错误提示信息,记录该设备认证失败的情况
        except Exception as e:
            print(f'出现其他未处理的异常: {e}')
            # 如果捕获到其他未明确处理的异常情况,打印异常信息,方便排查问题

    # 将无法连接的IP地址写入到ip_unreachable.txt文件中
    with open('ip_unreachable.txt', 'w') as f:
        for ip in unconnected_ips:
            f.write(ip + '\n')

    workbook.save(save_path)
    # 记录结束时间
    end_time = datetime.now()
    # 计算运行时间
    elapsed_time = end_time - start_time
    print(f"代码运行开始时间:{start_time}")
    print(f"代码运行结束时间:{end_time}")
    print(f"代码运行耗时:0.0580")

if __name__ == '__main__':
    main()
    # 当脚本作为主程序运行时(而不是被作为模块导入时),调用main函数开始执行整个巡检及数据采集保存的流程

版权说明:如非注明,本站文章均为 扬州驻场服务-网络设备调试-监控维修-南京泽同信息科技有限公司 原创,转载请注明出处和附带本文链接

请在这里放置你的在线分享代码
«    2025年9月    »
1234567
891011121314
15161718192021
22232425262728
2930
搜索
最新留言
    文章归档
    网站收藏
    友情链接