软硬件环境
- Ubuntu 19.04 64bit
- anaconda3 with python 3.7.3
- netifaces 0.10.9
前言
netifaces
是一个非常简单好用的用来获取本机网卡信息的第三方库,如ip
地址, MAC
地址等等信息,支持Windows
, Linux
和MacOS
.
安装netifaces
采用pip
安装法
pip install netifaces
代码示例
获取当前主机所有的网卡设备,直接调用netifaces.interfaces
方法
In [1]: import netifaces
In [2]: netifaces.interfaces()
Out[2]: ['lo', 'enp0s25', 'wlp4s0']
下面通过具体的设备获取ip
地址和mac
地址, 如enp0s25
In [3]: netifaces.ifaddresses('enp0s25')
Out[3]:
{17: [{'addr': '50:7b:9d:d5:13:e6', 'broadcast': 'ff:ff:ff:ff:ff:ff'}],
2: [{'addr': '192.168.1.236',
'netmask': '255.255.255.0',
'broadcast': '192.168.1.255'}],
10: [{'addr': 'fe80::1e81:32c1:d085:a384%enp0s25',
'netmask': 'ffff:ffff:ffff:ffff::/64'}]}
可以看下这一串输出, 是不是很眼熟, 对, 跟ifconfig
命令的输出非常类似. 这就是对应网卡的所有信息, 包括ip
, mac
, netmask
等等. 通过这些信息, 我们就可以解析出我们想得到的ip
和mac
.
注意到在上述输出的字典信息中,key
的值是一个整形, 他们是在netifaces
模块中定义的, 如下所示
AF_APPLETALK = 5
AF_ASH = 18
AF_ATMPVC = 8
AF_ATMSVC = 20
AF_AX25 = 3
AF_BLUETOOTH = 31
AF_BRIDGE = 7
AF_DECnet = 12
AF_ECONET = 19
AF_FILE = 1
AF_INET = 2
AF_INET6 = 10
AF_IPX = 4
AF_IRDA = 23
AF_ISDN = 34
AF_KEY = 15
AF_LINK = 17
AF_NETBEUI = 13
AF_NETLINK = 16
AF_NETROM = 6
AF_PACKET = 17
AF_PPPOX = 24
AF_ROSE = 11
AF_ROUTE = 16
AF_SECURITY = 14
AF_SNA = 22
AF_UNIX = 1
AF_UNSPEC = 0
AF_WANPIPE = 25
AF_X25 = 9
他们对应特定的地址家族. 比如上述输出的数字2
代表的是ipv4
, 数字10
代表的是ipv6
. 这里需要特别注意的是, 在写代码的时候千万不要直接使用上述的数字, 因为这些数字在不同系统上可能是不一样的. 你可以这样编写代码
In [1]: import netifaces
# enp0s25是对应的网卡
In [2]: addr_dict = netifaces.ifaddresses('enp0s25')
# 注意到对应地址族的信息是一个list, 比如一个网卡可能有多个ip地址, 这时就需要根据实际情况进行获取
In [3]: ip = addr_dict[netifaces.AF_INET][0]['addr']
In [4]: ip
Out[4]: '192.168.1.111'
In [5]: netmask = addr_dict[netifaces.AF_INET][0]['netmask']
In [6]: netmask
Out[6]: '255.255.255.0'
In [7]: mac = addr_dict[netifaces.AF_LINK][0]['addr']
In [8]: mac
Out[9]: '50:7b:9d:d5:13:e6'
# 获取网管
In [10]: netifaces.gateways()
Out[10]:
{'default': {2: ('192.168.1.1', 'enp0s25')},
2: [('192.168.1.1', 'enp0s25', True)]}