2010-09-13 105 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

相關問題