Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Linux路由表查找_Python_Linux_Networking_Routes - Fatal编程技术网

Python Linux路由表查找

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

我发布了关于试图找到第一个跃点的文章,我想得越多,就越容易找到python中的路由表。我不是程序员,我不知道自己在做什么p

这就是我想到的,我注意到的第一个问题是环回接口没有显示在/proc/net/route文件中-因此评估127.0.0.0/8将为您提供默认路由。。。对于我的申请来说,这并不重要

还有什么我忽略的专业吗?解析
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时继续为您工作!