Python实用模块(十四)netifaces

原文链接

https://xugaoxiang.com/2019/12/04/python-module-netifaces/

前言

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)]}

参考资料

公众号

在这里插入图片描述

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

迷途小书童的Note

请博主喝矿泉书!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值