【问题标题】:Python find first network hopPython 找到第一个网络跃点
【发布时间】:2011-02-10 05:14:27
【问题描述】:

我需要在 Linux 上的 python 程序中找到第一个网络跃点。我不能只依赖默认网关作为第一跳,因为盒子上的某些网络软件可能(也可能不会)插入捕获所有路由:

0.0.0.0/1
128.0.0.0/1

我考虑过弹出tracepath -m 1 <some ip> 并解析输出,但我不喜欢依赖另一个程序的输出格式。从 /proc 读取路由表并对其应用路由逻辑我认为有点超出我的脚本能力,尽管我可能会在某个时候尝试它。有没有更简单的方法(我不知道的模块中是否有人已经发明了这个轮子)?

【问题讨论】:

  • 我认为您反对阅读 traceroute/tracepath 过于谨慎。这类应用程序几乎从不改变其输出格式,而且 traceroute 无处不在。

标签: python networking routing


【解决方案1】:

“catch all”路线有什么作用?如果它们只是网关路由,那么进行路由查找仍然有效。您可以执行以下操作:

$ 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

【讨论】:

  • 我不知道 iproute2 有 ip route get 这真的很方便。谢谢! @迈克
  • @tMC,没问题。我只是注意到这不适用于本地路线。 (你想要的字段偏移了一个)所以我猜你会被困在解析输出中。正则表达式可能适用于此。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-26
  • 1970-01-01
  • 2018-06-08
  • 2018-05-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多