2010-09-13 58 views
0

我需要在Linux环境中使用Python列出可用的网络接口及其IP地址和相应的网络掩码。我可以使用ioctlSIOCGIFCONF作为概述here获取每个接口的接口和IP地址,但是当涉及到在接口上存在多个IP地址时确定网络掩码时,我很头疼。使用Python检索具有多个IP地址的接口的网络掩码?

我可以得到一个接口的主IP地址的网络掩码为Retrieving network mask in Python建议:

import socket 
import fcntl 
import struct 

SIOCGIFNETMASK = 0x891b 

def get_network_mask(ifname): 
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
    netmask = fcntl.ioctl(s, SIOCGIFNETMASK, struct.pack('256s', ifname))[20:24] 
    return socket.inet_ntoa(netmask) 

>>> get_network_mask('eth0') 
'255.255.255.0' 

但是,如果我有相同的接口不同的网络掩码多个IP地址,这是不行的,如下:

$ ip addr show eth0 
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000 
    inet 192.168.1.1/16 brd 192.168.255.255 scope global eth0 
    inet 172.16.0.123/24 scope global eth0 

在这种情况下,我将只能使用上述功能检索其中一个网络掩码。有没有办法检索所有地址的网络掩码,除了解析ip addr showifconfig的输出?

回答

2

从技术上讲,“ip addr sh”所做的是使用netlink库来询问(并可选地监视)内核网络接口/路由表。

您可能能够做到这一点在Python,但我强烈建议解析“/ sbin目录/ IP地址sh”的

的输出。这是因为

  • 使用的rtnetlink库复杂
  • 你不关心性能 - 网络接口不改变往往不够,你关心
+0

由于(在任何情况下,你可以使用“IP监视器”监视它们)。我快速浏览了rtnetlink,你说得对,因为这个任务似乎过于复杂。解析'ip addr show'仍然感觉有些ha,,但我想这是在这种情况下最好的前进方式。 – 2010-09-13 13:34:22