怎么用脚本获取路由表?全网最详细的实操指南
目录导读
为什么你需要用脚本获取路由表?
网络运维、DevOps工程师、渗透测试人员经常会遇到这样的场景:

- 你需要监控服务器间路由是否正常,但不想手动敲
route命令。 - 你想编写一个自动巡检脚本,每天定时检查路由表变化。
- 你在做漏洞扫描或网络拓扑发现,需要程序化读取路由信息。
手动输入命令只能看到当前瞬间,而脚本化获取意味着你可以:
- 自动化采集:加入定时任务,持续追踪路由变更。
- 格式化输出:直接对接监控系统或数据库。
- 跨平台兼容:一套逻辑跑通Linux、Windows、macOS。
一句话总结:脚本获取路由表是网络自动化管理的第一步,也是CI/CD流水线中网络验证的基础。
路由表核心概念速览
在正式动手前,先澄清几个核心字段(方便你理解脚本输出):
| 字段 | 含义 | 示例 |
|---|---|---|
| Destination | 目标网络 | 0.0.0/0 |
| Gateway | 下一跳网关 | 168.1.1 |
| Interface | 出口网卡名或IP | eth0 / 192.168.1.100 |
| Metric | 路由优先级(值越小越优先) | 100 |
不同操作系统下字段名略有差异,但本质相同,脚本获取的核心就是把这些字段解析成结构化数据。
用脚本获取路由表的三种主流方法
Python + netifaces(跨平台)
适用场景:需要最干净的解析结果,且不想处理命令行文本解析。
安装:pip install netifaces
import netifaces
import json
def get_routes_py():
routes = []
gateways = netifaces.gateways()
# 路由表中关键数据通常包含在'default'和IPv4条目中
for iface in netifaces.interfaces():
addrs = netifaces.ifaddresses(iface)
if netifaces.AF_INET in addrs:
for addr in addrs[netifaces.AF_INET]:
routes.append({
"interface": iface,
"ip": addr['addr'],
"netmask": addr.get('netmask', ''),
"broadcast": addr.get('broadcast', '')
})
print(json.dumps(routes, indent=2))
get_routes_py()
优点:纯Python,跨平台,数据结构清晰。
缺点:gateways() 只返回默认网关,无法完整获取所有路由条目(非默认路由需逐接口读取)。
扩展建议:可搭配pyroute2库获取全部路由表,或直接调用os.system('route print')再解析(见方法二)。
Bash + ip route(Linux/Unix)
适用场景:生产服务器、嵌入式设备、Docker容器内部。
原理:用ip route show命令输出文本,然后通过awk/sed/grep切割。
#!/bin/bash
# 获取所有IPv4路由表,输出JSON格式
echo '['
ip -4 route show | while read line; do
# 解析目标网段、网关、接口
dest=$(echo $line | awk '{print $1}')
via=$(echo $line | awk '{for(i=1;i<=NF;i++) if($i=="via") print $(i+1)}')
dev=$(echo $line | awk '{for(i=1;i<=NF;i++) if($i=="dev") print $(i+1)}')
# 输出JSON行
echo "{\"destination\": \"$dest\", \"gateway\": \"${via:-direct}\", \"interface\": \"${dev:-unknown}\"},"
done | sed '$ s/,$//'
echo ']'
运行效果:
[
{"destination": "default", "gateway": "192.168.1.1", "interface": "eth0"},
{"destination": "10.0.0.0/8", "gateway": "10.0.0.254", "interface": "eth1"}
]
关键命令:
ip -4 route show:只显示IPv4(IPv6用-6)。ip -o route show:一行一个条目,更方便解析。
常见报错:
错误:
ip: command not found
解决:安装iproute2包(apt install iproute2/yum install iproute)。
PowerShell(Windows专用)
适用场景:Windows Server、桌面端网络自动化。
原理:Get-NetRoute 直接返回对象,无需文本解析。
# 获取所有路由并格式化输出 Get-NetRoute -AddressFamily IPv4 | Select-Object DestinationPrefix, NextHop, InterfaceAlias, RouteMetric | ConvertTo-Json
示例输出(截取):
[
{
"DestinationPrefix": "0.0.0.0/0",
"NextHop": "192.168.1.1",
"InterfaceAlias": "以太网",
"RouteMetric": 256
},
{
"DestinationPrefix": "192.168.1.0/24",
"NextHop": "0.0.0.0",
"InterfaceAlias": "以太网",
"RouteMetric": 256
}
]
注意:如果脚本需要在PowerShell 5.1以下运行,可改用netsh interface ipv4 show route命令并解析文本。
实战案例:一键导出路由表到CSV
很多人拿到路由表数据后,下一步就是导入Excel或数据库做分析,这里提供一个跨平台组合脚本:
#!/bin/bash
# 导出路由表为CSV并保存
echo "Destination, Gateway, Interface, Metric" > routes.csv
if [[ "$OSTYPE" == "linux-gnu"* ]]; then
ip -4 route show | while read line; do
dest=$(echo $line | awk '{print $1}')
via=$(echo $line | awk '{for(i=1;i<=NF;i++) if($i=="via") print $(i+1)}')
dev=$(echo $line | awk '{for(i=1;i<=NF;i++) if($i=="dev") print $(i+1)}')
# 从/proc/net/route也可以获得,但这是最简单的
echo "$dest,${via:-direct},$dev,100" >> routes.csv
done
elif [[ "$OSTYPE" == "msys" ]]; then # Windows下的Git Bash
netsh interface ipv4 show route | grep -E '^[ ]*[0-9]' | while read line; do
# 手动解析netsh输出...
echo "$line" >> routes.csv
done
fi
提示:实际生产环境中推荐用Python+
subprocess统一管理跨平台输出。
常见报错与排错指南
问题1:脚本返回空结果
- Linux下确认是否安装了
iproute2(which ip)。 - Windows下确保以管理员身份运行PowerShell(
Get-NetRoute需要管理员权限)。 - macOS用户需使用
netstat -rn代替ip route。
问题2:解析出的网关字段为空
- 默认路由通常有
via字段,但直连路由(如本地子网)没有网关,应标记为“direct”。 - 检查脚本是否漏掉
default via关键字。
问题3:IPv6路由混入导致格式混乱
- 显式指定
-4(Linux)或AddressFamily IPv4(Windows)。
问答环节
Q1:用脚本获取路由表会影响服务器性能吗?
A:不会,路由表读取属于系统级只读操作,开销远小于一次ping或DNS查询,在生产环境中,每分钟执行一次或者作为监控触发动作都完全安全。
Q2:我需要在Windows 7下运行,没有Get-NetRoute怎么办?
A:改用route print命令,并通过批处理或Python解析文本:
import subprocess
result = subprocess.check_output('route print', shell=True).decode('gbk')
# 按行解析IPv4路由段开始至“Persistent Routes”之前
Q3:脚本获取到的路由表能实时更新吗?
A:脚本执行的是“快照”,如需实时跟踪变化,可写一个循环:
- 每秒获取一次路由表,对比前后差异。
- 或使用Linux的
ip monitor route命令(实时输出变更事件)。
Q4:如何只获取某个网卡(如eth0)的路由?
A:Linux下:ip route show dev eth0;Windows下:Get-NetRoute -InterfaceAlias "以太网"。
Q5:脚本获取的路由表和我手动看到的为什么有差异?
A:确认执行用户权限,普通用户可能看不到某些内核路由(如容器网络命名空间内的路由),尝试以root/管理员身份运行。
附:自动化部署小提示
如果你是在Kubernetes或容器集群中运行,还可以通过访问节点的/proc/net/route文件(内核暴露的原始路由表,格式固定)实现极低开销的读取,但注意不同内核版本字段偏移量可能变化。
写在最后
学会用脚本获取路由表,不仅是网络自动化的第一步,更是你理解操作系统网络栈的最佳入口,无论你选择哪种语言或平台,核心思路只有一条:找到系统命令→截取文本→结构化解析→输出可用格式。
如果你在尝试中遇到任何解析问题,欢迎留言讨论(避免使用特定域名,你可以在本地记录反馈)。最佳的脚本就是符合你当前场景、不用过度设计的那个。