欢迎访问我的网站,希望内容对您有用,感兴趣的可以加入我们的社群。

Python实用模块(十五)netifaces

实用模块 迷途小书童 5年前 (2019-12-04) 7449次浏览 0个评论

软硬件环境

  • Ubuntu 19.04 64bit
  • anaconda3 with python 3.7.3
  • netifaces 0.10.9

前言

netifaces是一个非常简单好用的用来获取本机网卡信息的第三方库,如ip地址, MAC地址等等信息,支持Windows, LinuxMacOS.

安装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等等. 通过这些信息, 我们就可以解析出我们想得到的ipmac.

注意到在上述输出的字典信息中,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)]}

参考资料

喜欢 (0)

您必须 登录 才能发表评论!