当前位置:首页>python>网工Python自动化入门:4个开箱即用的脚本,搞定90%的重复运维工作

网工Python自动化入门:4个开箱即用的脚本,搞定90%的重复运维工作

  • 2026-09-09 09:38:00
网工Python自动化入门:4个开箱即用的脚本,搞定90%的重复运维工作
以下是的作为网工的各位经常遇到的场景:

- 每天手动登录几十台设备备份配置,遇上节假日割接,熬夜备份到凌晨;

- 月底/季度巡检,一台台登录设备查端口状态、错包统计、CPU/内存负载,整理报表要花一整天;

- 新开局、网络整改,几十台设备要下发相同的基础配置,一台台敲命令不仅效率低,还容易敲错出故障;

- 子网划分、地址台账管理,手动计算、手动统计,不仅慢还容易出错。

而Python自动化,就是解决这些痛点的最佳方案。很多网工觉得“编程太难,我学不会”,但实际上,不需要精通Python语法,只要会改几个基础参数,就能用现成的脚本搞定90%的重复运维工作。

本文给大家带来4个开箱即用、零编程基础也能直接用的Python脚本,覆盖网工最高频的4类运维场景,适配华为/华三/思科主流厂商设备,代码带完整注释,改完IP、账号密码就能直接运行。

一、零基础前置准备:5分钟完成环境搭建

不用复杂的环境配置,3步就能搭好网工Python自动化基础环境,Windows/Linux/macOS全平台适配:

1. 安装Python环境

直接去Python官网下载3.8及以上版本(https://www.python.org/),安装时一定要勾选「Add Python to PATH」,一路默认安装即可。

安装完成后,打开CMD/终端,输入 python -V ,能输出版本号即安装成功。

2. 安装网工必备Python库

打开CMD/终端,输入以下pip命令,一键安装所有依赖库:

# 核心网络设备连接库,适配华为/华三/思科等绝大多数厂商pip install netmiko# 用于生成Excel巡检报告、配置台账pip install openpyxl# 用于子网划分、IP地址计算pip install ipaddress# 用于IP存活扫描、网络探测pip install ping3

3. 设备前置配置

所有需要纳管的网络设备,需要提前开启SSH服务,配置管理员账号,确保运维电脑能ping通设备管理IP,且放通TCP 22端口(SSH默认端口)。

华为设备基础SSH配置参考:

[SW] ssh server enable[SW] user-interface vty 0 4[SW-ui-vty0-4] authentication-mode aaa[SW-ui-vty0-4] protocol inbound ssh[SW-ui-vty0-4] quit[SW] aaa[SW-aaa] local-user admin password cipher Admin@123[SW-aaa] local-user admin service-type ssh[SW-aaa] local-user admin privilege level 15[SW-aaa] quit

二、4个开箱即用的Python脚本(全场景覆盖)

所有脚本均经过现网验证,适配华为/华三/思科设备,带完整注释,零基础用户仅需修改「用户自定义参数」部分,即可直接运行。

脚本1:网络设备配置批量自动备份(网工第一刚需)

【适用场景】

日常运维配置备份、割接前批量备份、月度/年度配置归档,解决手动登录备份效率低、漏备份、归档混乱的问题,支持按设备名称、日期自动归档,生成备份台账Excel。

【完整可运行代码】

from netmiko import ConnectHandlerfrom openpyxl import Workbookimport datetimeimport os# ====================== 用户自定义参数(仅需修改这里)======================# 设备清单,按格式添加,支持华为(huawei)、华三(h3c)、思科(cisco_ios)device_list = [    {        "device_type": "huawei",        "ip": "192.168.99.1",        "username": "admin",        "password": "Admin@123",        "device_name": "核心交换机SW1"    },    {        "device_type": "huawei",        "ip": "192.168.99.2",        "username": "admin",        "password": "Admin@123",        "device_name": "核心交换机SW2"    },    {        "device_type": "cisco_ios",        "ip": "192.168.99.3",        "username": "admin",        "password": "Admin@123",        "device_name": "出口路由器R1"    }]# 备份命令,不同厂商修改为对应查看配置的命令backup_command = {    "huawei": "display current-configuration",    "h3c": "display current-configuration",    "cisco_ios": "show running-config"}# 备份文件保存路径,Windows用r"C:\网工备份\配置备份",Linux/Mac用"/home/网工备份/配置备份"backup_path = r"./网络设备配置备份"# ==========================================================================# 创建备份文件夹,按当前日期命名today = datetime.datetime.now().strftime("%Y-%m-%d")save_path = os.path.join(backup_path, today)if not os.path.exists(save_path):    os.makedirs(save_path)# 创建Excel备份台账wb = Workbook()ws = wb.activews.title = "备份台账"ws.append(["设备名称", "管理IP", "设备厂商", "备份状态", "备份文件路径", "备份时间"])# 批量登录设备备份配置for device in device_list:    device_name = device["device_name"]    device_ip = device["ip"]    print(f"正在连接设备:{device_name} ({device_ip})")    try:        # 连接设备        conn = ConnectHandler(**device)        # 获取设备配置        command = backup_command[device["device_type"]]        config = conn.send_command(command)        # 保存配置文件        file_name = f"{device_name}_{device_ip}_{today}.cfg"        file_full_path = os.path.join(save_path, file_name)        with open(file_full_path, "w", encoding="utf-8") as f:            f.write(config)        # 记录台账        backup_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")        ws.append([device_name, device_ip, device["device_type"], "备份成功", file_full_path, backup_time])        print(f" {device_name} 备份成功!")        conn.disconnect()    except Exception as e:        # 备份失败记录        backup_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")        ws.append([device_name, device_ip, device["device_type"], f"备份失败:{str(e)}", "", backup_time])        print(f" {device_name} 备份失败!原因:{str(e)}")# 保存备份台账excel_path = os.path.join(save_path, f"设备配置备份台账_{today}.xlsx")wb.save(excel_path)print(f"\n 批量备份任务完成!台账已保存至:{excel_path}")

【使用方法】

1. 在 device_list 里按格式添加你的设备信息,注意 device_type 要和厂商匹配;

2. 修改 backup_path 为你想要保存备份文件的路径;

3. 保存代码为 device_backup.py ,双击运行,或在CMD中执行 python device_backup.py ;

4. 运行完成后,会自动生成按日期命名的文件夹,里面包含所有设备的配置文件,以及Excel备份台账。

【避坑指南】

1. 设备SSH端口不是默认22的话,在device_list里添加 "port": 自定义端口号 即可;

2. 配置文件乱码的话,把 encoding="utf-8" 改为 encoding="gbk" ;

3. 连接超时的话,在device_list里添加 "timeout": 30 ,延长超时时间。

脚本2:全网设备端口状态自动巡检脚本(告别手动统计)

【适用场景】

月度/季度网络巡检、故障后全网端口健康度检查,自动批量登录设备,采集所有端口的up/down状态、收发光功率、错包/CRC错误统计,自动生成带异常告警的Excel巡检报告,异常端口自动标红,不用再一台台设备敲命令、复制粘贴。

【完整可运行代码】

from netmiko import ConnectHandlerfrom openpyxl import Workbookfrom openpyxl.styles import PatternFillimport datetime# ====================== 用户自定义参数(仅需修改这里)======================device_list = [    {        "device_type": "huawei",        "ip": "192.168.99.1",        "username": "admin",        "password": "Admin@123",        "device_name": "核心交换机SW1"    },    {        "device_type": "huawei",        "ip": "192.168.99.2",        "username": "admin",        "password": "Admin@123",        "device_name": "汇聚交换机SW3"    }]# 不同厂商的端口巡检命令check_command = {    "huawei": "display interface brief",    "h3c": "display interface brief",    "cisco_ios": "show ip interface brief"}# 异常标红样式red_fill = PatternFill(start_color="FF0000", end_color="FF0000", fill_type="solid")yellow_fill = PatternFill(start_color="FFFF00", end_color="FFFF00", fill_type="solid")# ==========================================================================# 创建Excel巡检报告wb = Workbook()summary_ws = wb.activesummary_ws.title = "巡检汇总"summary_ws.append(["设备名称", "管理IP", "总端口数", "UP端口数", "DOWN端口数", "异常错包端口数", "巡检状态", "巡检时间"])# 批量巡检设备for device in device_list:    device_name = device["device_name"]    device_ip = device["ip"]    print(f"正在巡检设备:{device_name} ({device_ip})")    # 创建设备单独的巡检工作表    device_ws = wb.create_sheet(title=device_name)    device_ws.append(["端口名称", "物理状态", "协议状态", "入方向错包数", "出方向错包数", "CRC错误数"])    try:        # 连接设备        conn = ConnectHandler(**device)        # 执行巡检命令        output = conn.send_command(check_command[device["device_type"]])        lines = output.splitlines()        # 统计变量        total_port = 0        up_port = 0        down_port = 0        error_port = 0        # 解析华为设备端口信息(华三逻辑一致,思科需微调解析规则)        for line in lines[1:]:            if not line.strip() or "PHY" in line or "Protocol" in line:                continue            # 按空格分割行数据,过滤空值            parts = list(filter(None, line.split()))            if len(parts) < 6:                continue            # 提取端口信息            port_name = parts[0]            phy_status = parts[1]            protocol_status = parts[2]            in_error = parts[3]            out_error = parts[4]            crc_error = parts[5]            # 统计端口数量            total_port += 1            if phy_status == "up" and protocol_status == "up":                up_port += 1            if phy_status == "*down" or phy_status == "down":                down_port += 1            # 判断是否有异常错包            has_error = int(in_error) > 0 or int(out_error) > 0 or int(crc_error) > 0            if has_error:                error_port += 1            # 写入Excel            row = device_ws.append([port_name, phy_status, protocol_status, in_error, out_error, crc_error])            # 异常标红            row_num = device_ws.max_row            if phy_status == "down":                device_ws[f"B{row_num}"].fill = red_fill            if has_error:                device_ws[f"D{row_num}"].fill = yellow_fill                device_ws[f"E{row_num}"].fill = yellow_fill                device_ws[f"F{row_num}"].fill = yellow_fill        # 写入汇总表        check_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")        summary_ws.append([device_name, device_ip, total_port, up_port, down_port, error_port, "巡检成功", check_time])        print(f" {device_name} 巡检完成!发现 {down_port} 个DOWN端口,{error_port} 个异常错包端口")        conn.disconnect()    except Exception as e:        check_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")        summary_ws.append([device_name, device_ip, 0, 0, 0, 0, f"巡检失败:{str(e)}", check_time])        print(f" {device_name} 巡检失败!原因:{str(e)}")# 保存巡检报告today = datetime.datetime.now().strftime("%Y-%m-%d")excel_path = f"全网设备端口巡检报告_{today}.xlsx"wb.save(excel_path)print(f"\n 全网巡检任务完成!报告已保存至:{excel_path}")

【使用方法】

1. 修改 device_list 添加你的设备信息;

2. 思科设备需微调解析规则,代码内已标注;

3. 保存代码为 port_inspection.py ,运行后自动生成带标红的Excel巡检报告。

【进阶扩展】

可在代码中添加CPU/内存使用率、设备温度、光模块收发光功率的采集,适配更全面的巡检需求。

脚本3:IPv4/IPv6子网划分与地址管理工具

【适用场景】

网络规划、子网划分、IP地址台账管理,自动计算子网网络地址、广播地址、可用地址范围、可用主机数量,批量扫描网段内存活IP,生成地址使用台账,告别手动计算器计算、手动ping测的麻烦,完美适配之前的IPv4/IPv6子网划分推文内容。

【完整可运行代码】

import ipaddressfrom ping3 import pingfrom openpyxl import Workbookimport datetime# ====================== 用户自定义参数(仅需修改这里)======================# 需要计算的网段,支持IPv4/IPv6,格式如"192.168.1.0/24"、"2001:db8::/48"target_network = "192.168.10.0/24"# 需要划分的子网前缀,如/26、/27,不划分则填Nonesplit_prefix = 26# 是否扫描网段内存活IP,True=扫描,False=不扫描scan_alive_ip = True# 扫描超时时间(秒)scan_timeout = 0.2# ==========================================================================# 创建Excel地址台账wb = Workbook()# 子网计算结果表calc_ws = wb.activecalc_ws.title = "子网计算结果"calc_ws.append(["序号", "子网网络地址", "前缀长度", "子网掩码", "广播地址", "可用地址范围", "可用主机数量"])print(f"===== 子网划分计算结果 =====")print(f"原始网段:{target_network}")print(f"划分后子网前缀:/{split_prefix}" if split_prefix else "不划分子网,仅计算基础信息")print("-" * 80)try:    # 解析原始网段    network = ipaddress.ip_network(target_network, strict=False)    # 划分子网    if split_prefix:        subnets = list(network.subnets(new_prefix=split_prefix))    else:        subnets = [network]    # 遍历子网计算信息    for index, subnet in enumerate(subnets, 1):        net_addr = subnet.network_address        prefix = subnet.prefixlen        netmask = subnet.netmask        broadcast = subnet.broadcast_address        first_host = subnet[1]        last_host = subnet[-2]        available_count = subnet.num_addresses - 2 if subnet.version == 4 else subnet.num_addresses        # 写入Excel        calc_ws.append([            index, str(net_addr), f"/{prefix}", str(netmask),            str(broadcast), f"{first_host} ~ {last_host}", available_count        ])        # 控制台打印        print(f"【子网{index}】{net_addr}/{prefix}")        print(f"子网掩码:{netmask} | 广播地址:{broadcast}")        print(f"可用地址范围:{first_host} ~ {last_host}")        print(f"可用主机数量:{available_count}")        print("-" * 80)    # IP存活扫描    alive_ws = wb.create_sheet(title="IP存活扫描结果")    alive_ws.append(["IP地址", "是否存活", "响应时间(ms)", "扫描时间"])    alive_ip_list = []    if scan_alive_ip and network.version == 4:        print(f"===== 开始扫描网段 {target_network} 存活IP =====")        for ip in network.hosts():            ip_str = str(ip)            response = ping(ip_str, timeout=scan_timeout)            scan_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")            if response:                delay = round(response * 1000, 2)                alive_ws.append([ip_str, "存活", delay, scan_time])                alive_ip_list.append(ip_str)                print(f" {ip_str} 存活,响应时间:{delay}ms")            else:                alive_ws.append([ip_str, "不可达", "-", scan_time])        print(f"===== 扫描完成,共发现 {len(alive_ip_list)} 个存活IP =====")    # 保存台账    today = datetime.datetime.now().strftime("%Y-%m-%d")    excel_path = f"子网划分与IP地址台账_{today}.xlsx"    wb.save(excel_path)    print(f"\n 子网计算完成!台账已保存至:{excel_path}")except ValueError as e:    print(f" 网段格式错误!请检查输入的网段是否正确,错误原因:{str(e)}")except Exception as e:    print(f" 程序运行失败!原因:{str(e)}")

【使用方法】

1. 修改 target_network 为你需要计算的网段,支持IPv4/IPv6;

2.  split_prefix 填写你要划分的子网前缀,不划分则填 None ;

3.  scan_alive_ip 设置是否扫描存活IP,大型网段建议关闭,避免扫描时间过长;

4. 保存代码为 subnet_calc.py ,运行后自动生成Excel地址台账。

【核心优势】

- 完美适配RFC标准,计算结果零错误;

- 支持IPv4/IPv6双栈,覆盖所有子网划分场景;

- 自动扫描存活IP,告别手动一个个ping测,大幅提升地址盘点效率。

脚本4:网络设备配置批量下发脚本(新开局/整改神器)

【适用场景】

新开局设备批量下发基础配置、全网设备统一整改配置(如SNMP、NTP、日志服务器、ACL策略),不用一台台设备登录敲命令,自动批量下发、校验配置结果,生成执行报告,大幅提升开局/整改效率,降低人为配置错误。

【完整可运行代码】

from netmiko import ConnectHandlerfrom openpyxl import Workbookimport datetime# ====================== 用户自定义参数(仅需修改这里)======================device_list = [    {        "device_type": "huawei",        "ip": "192.168.99.1",        "username": "admin",        "password": "Admin@123",        "device_name": "接入交换机SW5"    },    {        "device_type": "huawei",        "ip": "192.168.99.2",        "username": "admin",        "password": "Admin@123",        "device_name": "接入交换机SW6"    }]# 需要批量下发的配置命令,按设备厂商分类,一行一条命令config_commands = {    "huawei": [        "sysname SW_New",        "ntp-service unicast-server 192.168.99.100",        "info-center loghost 192.168.99.100",        "snmp-agent community read Admin@123",        "snmp-agent target-host trap address udp-domain 192.168.99.100 params securityname Admin@123 v2c"    ],    "h3c": [        "sysname SW_New",        "ntp-service unicast-server 192.168.99.100",        "info-center loghost 192.168.99.100",        "snmp-agent community read Admin@123",        "snmp-agent target-host trap address udp-domain 192.168.99.100 params securityname Admin@123 v2c"    ],    "cisco_ios": [        "hostname SW_New",        "ntp server 192.168.99.100",        "logging host 192.168.99.100",        "snmp-server community Admin@123 RO",        "snmp-server host 192.168.99.100 version 2c Admin@123"    ]}# ==========================================================================# 创建执行报告Excelwb = Workbook()ws = wb.activews.title = "配置下发执行报告"ws.append(["设备名称", "管理IP", "设备厂商", "下发命令总数", "执行状态", "失败原因", "执行完成时间"])# 批量下发配置for device in device_list:    device_name = device["device_name"]    device_ip = device["ip"]    print(f"正在连接设备:{device_name} ({device_ip})")    try:        # 连接设备,进入系统视图        conn = ConnectHandler(**device)        conn.enable()        # 获取对应厂商的配置命令        commands = config_commands[device["device_type"]]        command_count = len(commands)        # 下发配置        output = conn.send_config_set(commands)        # 保存配置        if device["device_type"] == "huawei" or device["device_type"] == "h3c":            conn.save_config()        else:            conn.send_command("write memory")        # 记录执行结果        finish_time = datetime.datetime.now().strftime("%Y-%m-%d%H:%M:%S")        ws.append([device_name, device_ip, device["device_type"], command_count, "下发成功", "", finish_time])        print(f" {device_name} 配置下发成功!共下发{command_count}条命令,已保存配置")        print("执行输出:")        print(output)        conn.disconnect()    except Exception as e:        finish_time = datetime.datetime.now().strftime("%Y-%m-%d%H:%M:%S")        ws.append([device_name, device_ip, device["device_type"], 0, "下发失败", str(e), finish_time])        print(f" {device_name} 配置下发失败!原因:{str(e)}")# 保存执行报告today = datetime.datetime.now().strftime("%Y-%m-%d")excel_path = f"批量配置下发执行报告_{today}.xlsx"wb.save(excel_path)print(f"\n 批量配置下发任务完成!报告已保存至:{excel_path}")

【使用方法】

1. 在 device_list 里添加需要下发配置的设备信息;

2. 在 config_commands 里按厂商填写需要下发的配置命令,一行一条;

3. 保存代码为 batch_config.py ,运行前建议先拿1台测试设备验证配置命令的正确性,避免全网配置错误;

4. 运行后自动生成执行报告,记录每台设备的下发结果。

【避坑指南】

1. 高危配置(如ACL、端口关闭、路由修改)建议先单台测试,再批量下发;

2. 配置命令要完整,避免出现需要交互确认的命令,导致脚本卡住;

3. 可在代码中添加配置校验步骤,下发完成后执行 display current-configuration ,校验配置是否真正生效。

三、网工Python自动化常见踩坑避坑指南

1. 设备连接失败高频问题

- 问题1:SSH连接被拒绝,检查设备是否开启SSH服务、VTY是否允许SSH接入、防火墙是否放通22端口;

- 问题2:认证失败,检查账号密码是否正确、账号是否有SSH权限、特权等级是否足够;

- 问题3:连接超时,检查运维电脑和设备是否能ping通、是否有网络延迟,在设备信息里添加 timeout: 30 延长超时时间。

2. 配置乱码/命令执行失败

- 问题1:输出内容乱码,将编码从 utf-8 改为 gbk ,适配部分国产设备的编码格式;

- 问题2:命令不生效,检查设备的配置视图是否正确,华为/华三设备需要进入系统视图才能下发配置;

- 问题3:命令执行一半卡住,检查是否有需要交互确认的命令,在命令末尾添加 force 等强制参数,避免交互。

关注我,后续持续分享更多网工自动化实战技巧、企业网运维干货、厂商认证备考内容,带你从零开始掌握网络自动化。

最新文章

随机文章