怎么用脚本获取路由表

wen 实用脚本 3

怎么用脚本获取路由表?全网最详细的实操指南

目录导读

  1. 为什么你需要用脚本获取路由表?
  2. 路由表核心概念速览
  3. 用脚本获取路由表的三种主流方法
  4. 实战案例:一键导出路由表到CSV
  5. 常见报错与排错指南
  6. 问答环节

为什么你需要用脚本获取路由表?

网络运维、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下确认是否安装了iproute2which 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文件(内核暴露的原始路由表,格式固定)实现极低开销的读取,但注意不同内核版本字段偏移量可能变化。


写在最后

学会用脚本获取路由表,不仅是网络自动化的第一步,更是你理解操作系统网络栈的最佳入口,无论你选择哪种语言或平台,核心思路只有一条:找到系统命令→截取文本→结构化解析→输出可用格式

如果你在尝试中遇到任何解析问题,欢迎留言讨论(避免使用特定域名,你可以在本地记录反馈)。最佳的脚本就是符合你当前场景、不用过度设计的那个

抱歉,评论功能暂时关闭!