Python Linux路由表查找
我发布了关于试图找到第一个跃点的文章,我想得越多,就越容易找到python中的路由表。我不是程序员,我不知道自己在做什么p 这就是我想到的,我注意到的第一个问题是环回接口没有显示在/proc/net/route文件中-因此评估127.0.0.0/8将为您提供默认路由。。。对于我的申请来说,这并不重要 还有什么我忽略的专业吗?解析Python Linux路由表查找,python,linux,networking,routes,Python,Linux,Networking,Routes,我发布了关于试图找到第一个跃点的文章,我想得越多,就越容易找到python中的路由表。我不是程序员,我不知道自己在做什么p 这就是我想到的,我注意到的第一个问题是环回接口没有显示在/proc/net/route文件中-因此评估127.0.0.0/8将为您提供默认路由。。。对于我的申请来说,这并不重要 还有什么我忽略的专业吗?解析ip路由get还是一个更好的主意吗 import re import struct import socket ''' Read all the routes i
ip路由get
还是一个更好的主意吗
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文件系统的手册页中给出了
/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或任何其他标准工具。使用子流程模块将这些命令清晰地包装起来,并获取所需的信息。使用.IPRoute,在前往某个远程主机的途中获得下一个跃点,这里是-8.8.8:
from pyroute2 import IPRoute
with IPRoute() as ipr:
print(ipr.route('get', dst='8.8.8.8'))
看起来是一个有趣的练习(当然我有偏见),但我仍然建议使用ip-route-get
。优点:有人已经为您完成了所有调试。=)例如,他们知道如何处理路线类型之间的差异,包括您已经发现的使用本地路线的拐角情况。(想想其他类型:单播、本地、广播、黑洞等)此外,ip
将在您开始支持IPv6时继续为您工作!