本文目录导读:

这是一个很好的问题。脚本本身不能直接改变物理网络的路由表(那是路由器/防火墙的职责),但脚本可以通过自动化调用路由器的API、SSH命令或CLI工具,来批量修改或添加路由规则。
所以答案是:可以,但脚本是工具,实际执行路由更新的是你网络设备上的路由协议或静态路由配置。
下面介绍几种常见的“用脚本批量管理路由”的实用场景和方法,以及一个简单的示例。
主要方法
-
SSH到网络设备(最通用)
- 适用:思科、华为、H3C、Juniper、MikroTik(RouterOS)、Linux服务器等。
- 原理:脚本通过SSH登录到路由器/交换机,执行一系列
ip route或route add命令。 - 示例:使用Python的
netmiko或paramiko库,或者简单的Shell脚本配合sshpass。
-
API调用(现代化网络)
- 适用:支持RESTful API的云路由器(如AWS VPC、Azure Route Table)、SDN控制器(如OpenDaylight)、或企业级设备(如Cisco NSO、Arista CloudVision)。
- 原理:脚本构造HTTP请求(POST/PUT/GET),直接向设备的API端点发送路由配置。
- 示例:使用
curl或Python的requests库。
-
本地系统路由(Linux/Windows)
- 适用:你有一台Linux服务器,需要临时或永久添加很多静态路由(比如通过VPN、多网卡、Docker等)。
- 原理:直接在操作系统层面通过
ip route add或route add命令批量添加。 - 示例:一个for循环脚本。
实用脚本示例(Linux/SSH批量添加路由)
场景:你有一个远程的MikroTik RouterOS路由器,需要一次性添加20条静态路由,指向不同的子网到同一个网关。
脚本(使用 Bash + sshpass ):
#!/bin/bash
# 目标路由器信息
ROUTER_IP="10.0.0.1"
USERNAME="admin"
PASSWORD="your_secure_password"
GATEWAY="192.168.1.1" # 默认网关
# 创建一个临时命令文件
echo "/ip route print" > cmd.txt
# 批量添加路由(假设你有子网列表)
# 格式:目标网络 到 网关
for subnet in "10.1.0.0/24" "10.1.1.0/24" "10.1.2.0/24" "172.16.0.0/16"; do
# 注意:MikroTik 的语法是 /ip route add dst-address=... gateway=...
echo "/ip route add dst-address=${subnet} gateway=${GATEWAY}" >> cmd.txt
done
# 通过SSH一次性发送所有命令
sshpass -p "$PASSWORD" ssh -o StrictHostKeyChecking=no ${USERNAME}@${ROUTER_IP} < cmd.txt
# 清理
rm cmd.txt
echo "批量路由添加完成!"
更优雅的Python版本(使用 netmiko):
from netmiko import ConnectHandler
# 定义设备连接信息(以Cisco为例)
device = {
'device_type': 'cisco_ios', # 也可以改为 'mikrotik_routeros', 'huawei', 'linux' 等
'ip': '10.0.0.1',
'username': 'admin',
'password': 'your_password',
'secret': 'enable_password', # 如果是Cisco需要enable
}
# 批量路由列表
routes = [
"ip route 10.1.1.0 255.255.255.0 192.168.1.1",
"ip route 10.1.2.0 255.255.255.0 192.168.1.1",
"ip route 172.16.0.0 255.255.0.0 192.168.1.1",
]
# 连接设备并发送命令
connect = ConnectHandler(**device)
connect.enable() # 进入特权模式(仅Cisco需要)
output = connect.send_config_set(routes) # 批量发送配置
print(output)
connect.disconnect()
print("批量路由配置成功!")
重要注意事项(踩坑指南)
- 安全性:脚本中硬编码密码是禁忌,建议使用环境变量、SSH密钥、或集成密码管理器(如Hashicorp Vault)。
- 幂等性:确保你的脚本可以重复运行而不产生重复路由,通常需要先检查路由是否存在(
ping或show ip route),或者使用replace/override模式(如果设备支持)。 - 错误处理:如果有几条路由添加失败,你的脚本应该能捕获错误并记录,而不是继续盲目添加。
- 回滚方案:批量修改生产网络的路由是高风险操作,最好有一个“一键回滚到之前配置”的脚本(先备份当前路由表,修改失败后能恢复)。
- 并发与顺序:如果路由之间有依赖关系(比如需要先添加一个父路由),脚本必须按正确顺序执行。
| 场景 | 脚本工具 | 操作对象 | 风险等级 |
|---|---|---|---|
| 个人Linux电脑 | Shell (for循环 + ip route) |
本机路由表 | 低 |
| 企业网络设备批量 | Python + Netmiko, Ansible | 路由器/交换机 | 高 |
| 云网络(AWS/Azure) | AWS SDK (Boto3), Azure CLI | 云路由表 | 中 |
| 自动化运维平台 | Ansible Playbook (template模块) |
多台设备 | 高 |
实用建议:如果你的网络环境是静态路由,脚本是极好的“批量路由”工具,但如果是大型动态网络(OSPF/BGP),你更应该考虑路由聚合(Summary) 或 动态路由协议本身的自动学习能力,而不是通过脚本写大量静态路由,脚本更适合管理少量但频繁变化的静态路由(比如VPN隧道、临时测试网络)。