在Python中获取网络掩码

7 投票
10 回答
22633 浏览
提问于 2025-04-15 11:58

请问怎么获取网络设备的子网掩码呢?最好是在Linux系统上,不过如果能跨平台那就更好了。我知道在Linux上用C语言怎么做,但在Python里找不到方法——除了可能用ctypes。或者解析一下ifconfig命令。还有其他方法吗?

ioctl(socknr, SIOCGIFNETMASK, &ifreq) // C version

10 个回答

4

你有没有看看这里?

http://docs.python.org/library/fcntl.html

在Linux上,我在Python 2.5.2中这样做是有效的。虽然在我完成之前Ben已经先走一步了,但我还是把它发出来(真是可惜浪费了努力 :-) ):

vinko@parrot:~$ more get_netmask.py
# get_netmask.py by Vinko Vrsalovic 2009
# Inspired by http://code.activestate.com/recipes/439093/
# and http://code.activestate.com/recipes/439094/
# Code: 0x891b SIOCGIFNETMASK

import socket
import fcntl
import struct
import sys

def get_netmask(ifname):
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        return socket.inet_ntoa(fcntl.ioctl(s.fileno(), 0x891b, struct.pack('256
s',ifname))[20:24])

if len(sys.argv) == 2:
        print get_netmask(sys.argv[1])
vinko@parrot:~$ python get_netmask.py lo
255.0.0.0
vinko@parrot:~$ python get_netmask.py eth0
255.255.255.0
9

这里要提一下 netifaces 这个模块。直接引用文档上的内容:

>>> netifaces.interfaces()
['lo0', 'gif0', 'stf0', 'en0', 'en1', 'fw0']

>>> addrs = netifaces.ifaddresses('en0')
>>> addrs[netifaces.AF_INET]
[{'broadcast': '10.15.255.255', 'netmask': '255.240.0.0', 'addr': '10.0.1.4'}, {'broadcast': '192.168.0.255', 'addr': '192.168.0.47'}]

它可以在Windows、Linux、OS X上运行,可能还支持其他UNIX系统。

9

在Linux上,我在Python 2.2中用这个方法可以成功运行:

iface = "eth0"
socket.inet_ntoa(fcntl.ioctl(socket.socket(socket.AF_INET, socket.SOCK_DGRAM), 35099, struct.pack('256s', iface))[20:24])

撰写回答