我需要在Linux上的python程序中找到第一个网络跃点。我不能仅仅依赖默认网关作为第一跳,因为盒子上的某些网络软件可能(或可能不)插入捕获所有路由:
0.0.0.0/1
128.0.0.0/1
我已经考虑过popen'ing tracepath -m 1 <some ip>
并解析输出,但我不喜欢取决于另一个程序的输出格式。从/ proc读取路由表并将路由逻辑应用到它我觉得有点超出我的脚本功能,但我可能会在某个时候尝试它。有没有一种更简单的方法(有其他人已经发明了 - 这个轮子在我不知道的模块中)?
答案 0 :(得分: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
...或on-link路由的接口名称:
$ ip route get 192.168.0.2 | head -1 | awk '{ print $3 }'
eth0
顺便说一句(正如我的回答所暗示的)我同意评论说不依赖外部程序的原则在这种情况下是过分谨慎的。 =)我怀疑ip
的输出会改变。
我个人使用路由查找,因为tracepath
或traceroute
依赖于第一跳主机实际向您发送TTL expired
ICMP消息(可能会丢弃它)。我不知道你的用例是什么。
如果您需要python库来执行此操作,我会查看libdnet。