Python Linux поиск таблицы маршрутов - PullRequest
4 голосов
/ 10 февраля 2011

Я разместил Python найти первый сетевой прыжок о попытке найти первый прыжок, и чем больше я думал об этом, тем проще казалось, что это будет процесс таблицы маршрутизации в python. Я не программист, я не знаю, что я делаю. : Р

Это то, что я придумал, первая проблема, которую я заметил, это то, что петлевой интерфейс не отображается в файле / proc / net / route, поэтому оценка 127.0.0.0/8 даст вам маршрут по умолчанию. для моего приложения это не имеет значения.

Что-то еще, что я пропускаю? Разбор ip route get <ip> все еще лучше?

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])

Ответы [ 2 ]

6 голосов
/ 10 февраля 2011

В справочной странице файловой системы 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 или любой другой стандартный инструмент.Оберните эти команды аккуратно с помощью модуля подпроцесса и получите информацию о том, что вы ищете.

2 голосов
/ 17 февраля 2015

С помощью pyroute2 .IPRoute получите следующий прыжок на пути к некоторому удаленному хосту, здесь - 8.8.8.8:

from pyroute2 import IPRoute

with IPRoute() as ipr:
    print(ipr.route('get', dst='8.8.8.8'))
...