- 每天手动登录几十台设备备份配置,遇上节假日割接,熬夜备份到凌晨;
- 月底/季度巡检,一台台登录设备查端口状态、错包统计、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 等强制参数,避免交互。
关注我,后续持续分享更多网工自动化实战技巧、企业网运维干货、厂商认证备考内容,带你从零开始掌握网络自动化。