Python 找到第一个网络跳点
我需要在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
的输出不会改变。
就我个人而言,我会使用路由查找,因为tracepath
或traceroute
会依赖于第一个跳的主机实际发送给你TTL expired
的ICMP消息(它可能会丢掉这个消息)。不过我不知道你的具体需求是什么。
如果你需要一个Python库来实现这个功能,我建议你看看libdnet。