干了七八年网络运维,我最大的感受是:真正让人崩溃的从来不是网络故障本身,而是重复操作太多。几十台交换机上线,一台一台敲命令行,一个 VLAN 一个 VLAN 地加,手一抖还会把接口划错。后来我把日常设备配置和状态巡检逐步改造成了 Shell 脚本批量执行,效率提升是肉眼可见的,原来需要半天的工作量压缩到十几分钟,而且错误率比手工操作低得多。这篇就围绕“Shell 批量配置网络设备、监控网络状态”这个场景,把我在实际运维中总结的脚本思路、执行流程和踩过的坑完整写出来,供同样在跟网络设备死磕的兄弟们参考。
1. 先算一笔账:手工配置网络设备到底贵在哪里
1.1 看得见的时间成本
按一台接入层交换机从零开始上线来算,标准化流程大概是:接 console 线或者通过 SSH 登录设备、清空旧配置、设置设备名和管理 IP、创建 VLAN、配置接口划入对应 VLAN、关闭未用接口、配置 SSH 远程管理、最后保存配置并验证连通性。手速再快,整个过程也要 15 到 20 分钟。
这还只是单台设备。如果是一次园区网改造,几十台上联交换机加百余个接入交换机,纯手工操作意味着连续多天泡在命令行里。我之前统计过一次,配置 50 台接入交换机,纯手工大概需要 12 到 15 个小时。中间还要吃饭、上厕所、被临时电话打断,实际耗时基本要翻倍。而用 Shell 脚本批量化之后,同样的 50 台设备,串行执行大约 20 到 30 分钟就能全部跑完。这还只是配置阶段,后面还有验证阶段,验证同样可以被脚本自动化。
1.2 看不见的风险成本
比时间成本更隐蔽的是风险成本。手工操作时,人的注意力是递减的,配置第 5 台设备时可能还精神抖擞,配置到第 35 台时眼睛已经开始花了。VLAN 编号看错、接口编号打错、掩码多写一位,这类错误几乎无法完全避免。而且设备操作一旦出错,排障的时间往往比配置的时间更长。你要先确认哪台设备出了问题,再登上去看当前配置,对照变更记录排查,过程非常痛苦。
批量脚本在这方面的优势不仅仅是快,更重要的是“每次执行的内容完全一致”。脚本按统一的模板生成配置,每一台设备拿到的命令格式相同,只有变量部分不同。这种一致性让错误率从“人难免手滑”降到了“只要模板对就不会错”。
1.3 Shell 在网络运维中的定位
有人可能会问:做自动化不是有 Ansible 吗?不是有 Nornir 吗?为什么还要用 Shell?
这是我从实际环境出发的理解:Shell 是网络运维自动化最底层的“通用语言”。你写 Ansible 模块,底层本质还是要通过 SSH 连接设备执行命令;你写 Python 脚本,调用 netmiko 或者 paramiko,那也只是封装了连接和命令下发的底层逻辑。Shell 脚本的优势在于它几乎零依赖,任何一台 Linux 服务器上都带 bash,配合 expect、sshpass 这类小工具就能直接操作网络设备。对于中小型网络环境,没有必要为了自动化专门搭建一套 Ansible 控制节点,Shell 脚本轻量、直观、改起来快。
当然,Shell 也有它的短板,比如不适合做大规模的配置审计和状态收敛,这我在后面会专门讨论。但作为网络管理员的日常工具,Shell 的性价比非常高。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 批量配置的核心思路:把交互式会话改造成自动化对话
2.1 设备台账标准化是整个自动化的地基
不管用什么脚本批量配置,前提都是你手里有一份准确的设备清单。很多运维同行上来就写脚本,结果第一轮跑下来一半设备登录失败,回头一查,要么 IP 写错了,要么密码不同,要么设备型号混用导致命令不兼容。这份清单就是设备台账,它的质量直接决定自动化能不能落地。
我的习惯是先维护一个纯文本格式的设备清单,每行代表一台设备,字段用空格或者逗号分隔。比如:
text复制192.168.10.11 接入-3F-A vlan100 uplink=Gi0/24
192.168.10.12 接入-3F-B vlan101 uplink=Gi0/24
192.168.10.13 接入-4F-A vlan102 uplink=Gi0/24
把 IP、设备名、业务 VLAN、上联口这些差异化信息抽出来,脚本只读这份清单,然后逐行生成配置。这样做的好处很直接:以后新增设备,只需要在清单里加一行,不需要动脚本本身。设备台账结构建议包含以下字段:
- 管理 IP 地址
- 设备名称与所在位置
- 设备厂商和型号(用于适配不同命令集)
- 业务 VLAN 或其他配置参数
- 上联接口编号
- 登录凭据的引用信息
实际执行时,脚本会忽略以 # 开头的注释行,方便在清单里写说明。
2.2 expect 脚本实现 SSH 自动登录和命令下发
网络设备和 Linux 主机不一样,登录进去之后是一个交互式 CLI 环境。Shell 脚本本身没办法直接跟交互式程序对话,这时候就要借助 expect。expect 可以理解为一个“会话自动应答器”,它监听程序输出,当匹配到指定的字符串(比如 Password:、>、#)时,自动发送提前定义好的指令。
下面是我实际用过的 expect 配置脚本,简化后大概是这个样子:
expect复制#!/usr/bin/expect
# 批量配置 expect 脚本
# 用法: ./deploy.exp <IP> <设备名> <VLAN>
set timeout 30
set ip [lindex $argv 0]
set name [lindex $argv 1]
set vlan [lindex $argv 2]
set user "admin"
set pass "YourPass"
log_file -a /var/log/netdeploy.log
spawn ssh -o StrictHostKeyChecking=no $user@$ip
expect {
"Password:" { send "$pass\r" }
