问题描述
我发布了有关尝试查找第一个跃点和我考虑得越多,就越容易实现python中的路由表处理。我不是程序员,我不知道自己在做什么。 :p
I posted Python find first network hop about trying to find the first hop and the more I thought about it, the easier it seemed like it would be a process the routing table in python. I'm not a programmer, I don't know what I'm doing. :p
这是我想到的,我注意到的第一个问题是环回接口未显示在/ proc / net / route文件中-因此评估127.0.0.0/8会为您提供默认路由...对于我的应用程序来说,没关系。
This is what I came up with, the first issue I noticed is the loopback interface doesn't show up in the /proc/net/route file- so evaluating 127.0.0.0/8 will give you the default route... for my application, that doesn't matter.
我还能忽略的其他主要内容吗?解析 ip路由得到< ip>
还是一个更好的主意吗?
Anything else major I'm overlooking? Is parsing ip route get <ip>
still a better idea?
import re
import struct
import socket
'''
Read all the routes into a list. Most specific first.
# eth0 000219AC 04001EAC 0003 0 0 0 00FFFFFF ...
'''
def _RtTable():
_rt = []
rt_m = re.compile('^[a-z0-9]*\W([0-9A-F]{8})\W([0-9A-F]{8})[\W0-9]*([0-9A-F]{8})')
rt = open('/proc/net/route', 'r')
for line in rt.read().split('\n'):
if rt_m.match(line):
_rt.append(rt_m.findall(line)[0])
rt.close()
return _rt
'''
Create a temp ip (tip) that is the entered ip with the host
section striped off. Matching to routers in order,
the first match should be the most specific.
If we get 0.0.0.0 as the next hop, the network is likely(?)
directly attached- the entered IP is the next (only) hop
'''
def FindGw(ip):
int_ip = struct.unpack("I", socket.inet_aton(ip))[0]
for entry in _RtTable():
tip = int_ip & int(entry[2], 16)
if tip == int(entry[0], 16):
gw_s = socket.inet_ntoa(struct.pack("I", int(entry[1], 16)))
if gw_s == '0.0.0.0':
return ip
else:
return gw_s
if __name__ == '__main__':
import sys
print FindGw(sys.argv[1])
推荐答案
在proc文件系统的手册页中给出了该信息。
In the man page of proc file system it is given that.
/proc/net
various net pseudo-files, all of which give the status of some part of
the networking layer. These files contain ASCII structures and are,
there‐fore, readable with cat(1).
However, the standard netstat(8) suite provides much
cleaner access to these files.
仅依靠为这些目的设计的工具。使用netstat,traceroute或任何其他标准工具。使用子进程模块干净包裹这些命令,并获取所需信息。
Just rely on the tools designed for those purposes. Use netstat, traceroute or any other standard tool. Wrap those commands cleanly using subprocess module and get the information for what you are looking for.
这篇关于Python Linux路由表查找的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!