是否有使用python3在本地获取默认网络接口的方法?

Cap*_*idd 2 python networking routing python-3.3

嗨,我想使用Python获取默认的网络接口。谷歌之后,我pynetinfo可以做到这一点。但pynetinfo似乎在Python3上不起作用。还有另一种方法可以代替pynetinfo吗?

jab*_*edo 5

如果您使用的是Linux,则可以直接在上检查路由表/proc/net/route。此文件包含系统的路由参数,下面是一个示例:

Iface   Destination Gateway     Flags   RefCnt  Use Metric  Mask        MTU Window  IRTT
eth1    0009C80A    00000000    0001    0       0   0       00FFFFFF    0   0       0
eth2    0000790A    00000000    0001    0       0   0       0080FFFF    0   0       0
eth3    00007A0A    00000000    0001    0       0   0       0080FFFF    0   0       0
eth0    00000000    FE09C80A    0003    0       0   0       00000000    0   0       0
Run Code Online (Sandbox Code Playgroud)

在此示例中,分别通过eth1,eth2和eth3广播到网络10.200.9.0/24、10.121.0.0/25和10.122.0.0/25的所有流量,其余软件包使用eth0接口发送到网关10.200.9.254。所以问题是如何使用Python以编程方式获取此信息?

def get_default_iface_name_linux():
    route = "/proc/net/route"
    with open(route) as f:
        for line in f.readlines():
            try:
                iface, dest, _, flags, _, _, _, _, _, _, _, =  line.strip().split()
                if dest != '00000000' or not int(flags, 16) & 2:
                    continue
                return iface
            except:
                continue

get_default_iface_name_linux() # will return eth0 in our example
Run Code Online (Sandbox Code Playgroud)

  • 出于好奇,你为什么要检查 `or not int(flags, 16) & 2`? (2认同)

svi*_*ota 5

使用pyroute2

from pyroute2 import IPDB
ip = IPDB()
# interface index:
print(ip.routes['default']['oif'])
# interface details:
print(ip.interfaces[ip.routes['default']['oif']])
# release DB
ip.release()
Run Code Online (Sandbox Code Playgroud)