Python Linux路由表查找 [英] Python Linux route table lookup

查看:383
本文介绍了Python Linux路由表查找的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我发布了 Python查找第一个网络跃点有关尝试查找第一个跃点和我考虑得越多,就越容易实现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路由表查找的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆