Python 找到第一个网络跳点

1 投票
1 回答
2300 浏览
提问于 2025-04-16 11:33

我需要在Linux上的一个Python程序中找到第一个网络跳点。因为有些网络软件可能会在系统中插入一些通用的路由,所以我不能仅仅依赖默认网关作为第一个跳点。

这些通用路由看起来像这样:

0.0.0.0/1
128.0.0.0/1

我考虑过用来运行一个命令 tracepath -m 1 <某个IP>,然后解析输出结果,但我不喜欢依赖其他程序的输出格式。直接从/proc读取路由表并应用路由逻辑,我觉得这有点超出我的脚本能力,不过我可能会在某个时候尝试一下。有没有更简单的方法(有没有人已经在我不知道的模块中发明了这个)?

1 个回答

1

“捕获所有”路由到底是干什么的呢?如果它们只是网关路由,那么进行路由查找还是可以的。你可以这样做:

$ ip route get <ip> | head -1 | awk '{ print $3 }'

这样会打印出一个离线路由的网关地址:

$ ip route get 8.8.8.8 | head -1 | awk '{ print $3 }'
192.168.0.1

...或者打印出一个在线路由的接口名称:

$ ip route get 192.168.0.2 | head -1 | awk '{ print $3 }'
eth0

顺便说一下(就像我回答中提到的),我同意评论里的观点,认为在这种情况下不依赖外部程序有点过于谨慎了。=)我怀疑ip的输出不会改变。

就我个人而言,我会使用路由查找,因为tracepathtraceroute会依赖于第一个跳的主机实际发送给你TTL expired的ICMP消息(它可能会丢掉这个消息)。不过我不知道你的具体需求是什么。

如果你需要一个Python库来实现这个功能,我建议你看看libdnet

撰写回答