python 获取计算机的网卡信息


Posted in Python onFebruary 18, 2021

0. 前言

正常情况下,如果想要查看电脑的网卡IP地址或是MAC地址,直接通过界面找到网卡进行查看就有了,亦或是通过命令如linux的ifconfig得到IP等信息,那么本节教大家如何通过python的方式获取网卡的IP/MAC信息。

1. 测试环境及关键代码解释

1.1 测试环境

1.1.1 系统:

Ubuntu 16.04.6 LTS
Windows 10 x64

1.1.2 开发工具:

pycharm 专业版

备注:专业版支持本地远程linux调试。

2. 模块介绍及演示

本次只需要用到3个模块就搞定,但也是挺费劲的咯。

  1. netifaces //需要安装,主要用于获取网卡接口IP/MAC等信息;
  2. winreg //内置模块,主要用于Windows系统通过注册表获取网卡接口键值;
  3. platform //内置模块,主要用于判断系统类型:如Widows、Linux、MacOS等;

2.1 platform模块使用示例

Linux系统:

import platform
platform.system()
'Linux'  #返回结果

Windows系统:

import platform
platform.system()
'Windows'  #返回结果

2.2 netifaces模块使用示例

外置模块,安装方式请参考网上,此处忽略(很简单)。
用处:用于收集网络接口等信息(IP/地址/网关)。
netiface模块定了3个函数:

def gateways(*args, **kwargs):  #获取网关
 代码块
def ifaddresses(*args, **kwargs): #获取IP信息
 代码块
def interfaces(*args, **kwargs): #获取接口ID
 代码块

先看下地址族:

#!/usr/bin/env python3
#-*- coding:UTF-8 -*-
#欢迎关注微信公众号:点滴技术

#以下在Linux环境下演示

from netifaces
import pprint

pp = pprint.PrettyPrinter(indent=4)  #这里使用pprint输出会更直观

pp.pprint(netifaces.address_families)
#返回结果:
{ 0: 'AF_UNSPEC',
 1: 'AF_FILE',
 2: 'AF_INET',	#ipv4地址
 3: 'AF_AX25',
 4: 'AF_IPX',
 5: 'AF_APPLETALK',
 6: 'AF_NETROM',
 7: 'AF_BRIDGE',
 8: 'AF_ATMPVC',
 9: 'AF_X25',
 10: 'AF_INET6',	#ipv6地址
 11: 'AF_ROSE',
 12: 'AF_DECnet',
 13: 'AF_NETBEUI',
 14: 'AF_SECURITY',
 15: 'AF_KEY',
 16: 'AF_NETLINK',	
 17: 'AF_PACKET', #ipv4的MAC地址
 18: 'AF_ASH',
 19: 'AF_ECONET',
 20: 'AF_ATMSVC',
 22: 'AF_SNA',
 23: 'AF_IRDA',
 24: 'AF_PPPOX',
 25: 'AF_WANPIPE',
 31: 'AF_BLUETOOTH'}
 
#这里大家重点关注下:AF_NET、AF_NET6
#其他的大家自己去研究下

2.2.1 Linux环境下如何获取网卡口的信息

#!/usr/bin/env python3
#-*- coding:UTF-8 -*-
#欢迎关注微信公众号:点滴技术

import netifaces
import pprint

pp = pprint.PrettyPrinter(indent=4)
netifaces.interfaces()
 ['lo', 'ens32']   #返回结果,ubuntu系统网卡ID

pp.pprint(netifaces.ifaddresses('ens32'))
#返回结果,是一个字典,字典中又嵌套列表,所以切片的时候要注意
{ 2: [ { 'addr': '192.168.0.253',
    'broadcast': '192.168.0.255',
    'netmask': '255.255.255.0'}],
 10: [ { 'addr': 'fe80::20c:29ff:fe5d:2f55%ens32',
    'netmask': 'ffff:ffff:ffff:ffff::/64'}],
 17: [{'addr': '00:0c:29:5d:2f:55', 'broadcast': 'ff:ff:ff:ff:ff:ff'}]}

netifaces.ifaddresses('ens32')[netifaces.AF_INET][0]['addr']
'192.168.0.253'  #返回结果,获取到IPv4地址

netifaces.ifaddresses('ens32')[netifaces.AF_PACKET][0]['addr']
'00:0c:29:5d:2f:55'  #返回结果,获取到IPv4的MAC地址

netifaces.ifaddresses('ens32')[netifaces.AF_INET6][0]['addr']
'fe80::20c:29ff:fe5d:2f55%ens32'  #返回结果,获取到IPv6地址

2.2.2 Windows环境下如何获取网卡口的信息
说明:windows取值相比Linux复杂多了,不能直接根据接口获取ip信息,需要先找到一串唯一的键值,然后才能依据它获取到接口IP信息,这里我先给出示例,免得大家看了一头雾水:

我的无线网卡信息:

无线网卡名称:WLAN
注册表上对应的键值:{CD94297B-D746-4494-91F7-3E40C091A0FC} //python需要知道这个
注册表需要用到了【winreg】模块,咱们还是先简单聊下Windows的注册表结构吧。

>-----HKEY_CLASSES_ROOT
  >-----HKEY_CURRENT_USER
注册表 >-----HKEY_LOCAL_MACHINE
  >-----HKEY_USERS
  >-----HKEY_CURRENT_CONFIG
大体分为:主键--子键--键值

本次用到的函数:
winreg.ConnectRegistry(computer_name, key):
 连接注册表,computer_name=None表示本地计算机,否则用r"\\computername"表示远程计算机,key为键的链接。
 
winreg.OpenKey(key, sub_key, reserved=0, access=KEY_READ):
 打开指定的键,key已经打开的键,sub_key要打开的键。
 
winreg.QueryValueEx(key,value_name ):
 检索注册表项关联的指定值名称的类型和数据。

在Windows环境如何获取接口信息:

#以下在Windows环境下

import netifaces
import pprint

pp = pprint.PrettyPrinter(indent=4)
pp.pprint(netifaces.interfaces())
#返回结果:是个列表,都是一串子键... 这一 一对应网卡来的
[ '{90788744-5655-4A9E-ADB6-A97CAE0F3B3F}',
 '{02685473-BCE5-4E19-AC64-0388FA81C13F}',
 '{5BBD6405-7C2E-4A78-8A09-31E03FAA3B75}',
 '{95FDA148-CA04-4926-87CD-FC0DC38FF89C}',
 '{D87FBBE0-11C0-49D1-A8CE-52DFC195B1B4}',
 '{E31B9D7C-6E73-4773-B564-1038BDB0EDAD}',
 '{A7584008-7824-4760-B2E0-1D0F483FD64E}',
 '{CD94297B-D746-4494-91F7-3E40C091A0FC}', #剧透,这个就是无线网卡WLAN的唯一子键
 '{652C7833-4B8D-400F-A72F-F7C89C30FD03}',
 '{991AF727-67ED-11E9-B14B-806E6F6E6963}']
 
#请先记住我的无线网卡WLAN的键是: {CD94297B-D746-4494-91F7-3E40C091A0FC} 
#后面会介绍怎么获取;

#先看下获取ipv4相关的信息:
pp.pprint(netifaces.ifaddresses('{CD94297B-D746-4494-91F7-3E40C091A0FC}')[netifaces.AF_INET]
#返回结果
[ { 'addr': '172.20.18.37',
  'broadcast': '172.20.18.255',
  'netmask': '255.255.255.0'}]
  
#获取ipv4地址  
pp.pprint(netifaces.ifaddresses('{CD94297B-D746-4494-91F7-3E40C091A0FC}')[netifaces.AF_INET][0]['addr'])
'172.20.18.37' #返回结果

3. 完整代码

文件1:win_get_key.py
说明:windows系统上运行使用

#!/usr/bin/env python3
#-*- coding:UTF-8 -*-
#欢迎关注微信公众号:点滴技术

from netifaces import interfaces
import winreg as wr

#定义获取Windows系统网卡接口的在注册表的键值的函数
def get_key(ifname):
 #获取所有网络接口卡的键值
 id = interfaces()
 #存放网卡键值与键值名称的字典
 key_name = {}
 try:
  #建立链接注册表,"HKEY_LOCAL_MACHINE",None表示本地计算机
  reg = wr.ConnectRegistry(None,wr.HKEY_LOCAL_MACHINE)
  # 打开r'SYSTEM\CurrentControlSet\Control\Network\{4d36e972-e325-11ce-bfc1-08002be10318}',固定的
  reg_key = wr.OpenKey(reg , r'SYSTEM\CurrentControlSet\Control\Network\{4d36e972-e325-11ce-bfc1-08002be10318}')
 except :
  return ('路径出错或者其他问题,请仔细检查')

 for i in id:
  try:
   #尝试读取每一个网卡键值下对应的Name
   reg_subkey = wr.OpenKey(reg_key , i + r'\Connection')
   #如果存在Name,写入key_name字典
   key_name[wr.QueryValueEx(reg_subkey , 'Name')[0]] = i
   # print(wr.QueryValueEx(reg_subkey , 'Name')[0])
  except FileNotFoundError:
   pass
 # print('所有接口信息字典列表: ' + str(key_name) + '\n')
 return key_name[ifname]

if __name__ == '__main__':
 print(get_key('WLAN'))

文件2:python_netifaces.py
说明:在Window和Linux系统上运行使用

#!/usr/bin/env python3
#-*- coding:UTF-8 -*-
#欢迎关注微信公众号:点滴技术

from netifaces import ifaddresses ,AF_INET , AF_INET6
import platform

#定义获取ipv4信息的函数
def get_ip_address(ifname):
 #判断系统是否为Linux
 if platform.system() == "Linux":
  try:
   #返回ipv4地址信息
   return ifaddresses(ifname)[AF_INET][0]['addr']
  except ValueError:
   return None
 #判断是否为Windows系统
 elif platform.system() == "Windows":
  #调用函数get_key,获取到了网卡的键值
  from Tools.win_get_key import get_key
  key = get_key(ifname)
  if not key:
   return
  else:
   #返回ipv4地址信息
   return ifaddresses(key)[AF_INET][0]['addr']
 # 判断是否为Windows系统
 elif platform.system() == 'MacOS':
  pass
 else:
  print('您的系统本程序暂时不支持,目前只支持Linux、Windows、MacOS')

#定义获取ipv6信息的函数,与上面函数大体一致,不备注
def get_ipv6_address(ifname):
 if platform.system() == "Linux":
  try:
   return ifaddresses(ifname)[AF_INET6][0]['addr']
  except ValueError:
   return None
 elif platform.system() == "Windows":
  from Tools.win_get_key import get_key
  key = get_key(ifname)
  if not key:
   return
  else:
   return ifaddresses(key)[AF_INET6][0]['addr']
 elif platform.system() == 'MacOS':
  pass
 else:
  print('您的系统本程序暂时不支持,目前只支持Linux、Windows、MacOS')

if __name__ == '__main__':
 print('你的ipv4地址是:' + get_ip_address('WLAN'))
 print('你的ipv6地址是:' + get_ipv6_address('WLAN'))
 
#Windows系统下返回的结果:
 你的ipv4地址是:192.168.100.203
 你的ipv6地址是:240e:64:5222:2000:5d68:304d:6133:ab45

Linux系统下返回结果:

...省略...
...代码省略(同上)...

if __name__ == '__main__':
 #切换到远程Linux环境下,修改如下:
 print('你的ipv4地址是:' + get_ip_address('ens32'))
 print('你的ipv6地址是:' + get_ipv6_address('ens32'))
 
 #Linux系统下返回的结果 
 你的ipv4地址是:192.168.0.253
 你的ipv6地址是:fe80::20c:29ff:fe5d:2f55%ens32

4. 碎碎语

本次篇幅有点多,我是采用分解方式进行讲解,希望对大家有用,而不是一把把脚本贴上来。
我写的每一篇文章,希望对于网络攻城狮来说,能够如何运用python更好的提高工作效率和运维,而不仅仅局限在传统的局域网、广域网等,技术再迭代更新,个人的技能思维更需要贴合时代,共同进步。

4.1 官方参考链接:

netifaces模块:
https://pypi.org/project/netifaces/

winreg模块:
https://docs.python.org/3/library/winreg.html#exception-changed

以上就是python 获取计算机的网卡信息的详细内容,更多关于python 获取网卡信息的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
答题辅助python代码实现
Jan 16 Python
numpy使用fromstring创建矩阵的实例
Jun 15 Python
python如何实现从视频中提取每秒图片
Oct 22 Python
python 命令行传入参数实现解析
Aug 30 Python
python实现飞机大战小游戏
Nov 08 Python
详解Anconda环境下载python包的教程(图形界面+命令行+pycharm安装)
Nov 11 Python
Python 实现自动登录+点击+滑动验证功能
Jun 10 Python
pytorch 查看cuda 版本方式
Jun 23 Python
Python使用OpenPyXL处理Excel表格
Jul 02 Python
Python 获取异常(Exception)信息的几种方法
Dec 29 Python
pycharm配置QtDesigner的超详细方法
Jan 25 Python
基于Python绘制子图及子图刻度的变换等的问题
May 23 Python
python中time tzset()函数实例用法
Feb 18 #Python
python中zip()函数遍历多个列表方法
Feb 18 #Python
python模块内置属性概念及实例
Feb 18 #Python
Python中的流程控制详解
Feb 18 #Python
python爬取豆瓣电影排行榜(requests)的示例代码
Feb 18 #Python
python 爬取腾讯视频评论的实现步骤
Feb 18 #Python
Python之qq自动发消息的示例代码
Feb 18 #Python
You might like
array_multisort实现PHP多维数组排序示例讲解
2011/01/04 PHP
PHP动态创建Web站点的方法
2011/08/14 PHP
在windows平台上构建自己的PHP实现方法(仅适用于php5.2)
2013/07/05 PHP
thinkphp文件处理类Dir.class.php的用法分析
2014/12/08 PHP
PHP中串行化用法示例
2016/11/16 PHP
JavaScript 拾碎[三] 使用className属性
2010/10/16 Javascript
Firefox/Chrome/Safari的中可直接使用$/$$函数进行调试
2012/02/13 Javascript
JS数学函数Exp使用说明
2012/08/09 Javascript
通过jQuery源码学习javascript(三)
2012/12/27 Javascript
Jquery之Bind方法参数传递与接收的三种方法
2014/06/24 Javascript
基于NodeJS的前后端分离的思考与实践(二)模版探索
2014/09/26 NodeJs
ECMAScript中函数function类型
2015/06/03 Javascript
可以浮动某个物体的jquery控件用法实例
2015/07/24 Javascript
Ionic2调用本地SQlite实例
2017/04/22 Javascript
nodejs创建简易web服务器与文件读写的实例
2017/09/07 NodeJs
Vue的实例、生命周期与Vue脚手架(vue-cli)实例详解
2017/12/27 Javascript
vue嵌套路由与404重定向实现方法分析
2018/05/04 Javascript
JS通过位运算实现权限加解密
2018/08/14 Javascript
Vue使用轮询定时发送请求代码
2020/08/10 Javascript
js实现简易计算器小功能
2020/11/18 Javascript
Python面向对象class类属性及子类用法分析
2018/02/02 Python
python 定时任务去检测服务器端口是否通的实例
2019/01/26 Python
Python实现的在特定目录下导入模块功能分析
2019/02/11 Python
django框架model orM使用字典作为参数,保存数据的方法分析
2019/06/24 Python
pytorch实现用Resnet提取特征并保存为txt文件的方法
2019/08/20 Python
Python英文文章词频统计(14份剑桥真题词频统计)
2019/10/13 Python
python 给图像添加透明度(alpha通道)
2020/04/09 Python
毕业生个人投资创业计划书
2014/01/04 职场文书
荷叶圆圆教学反思
2014/02/01 职场文书
洗发露广告词
2014/03/14 职场文书
指导教师评语
2014/04/26 职场文书
纪检干部先进事迹材料
2014/08/23 职场文书
民主生活会发言材料
2014/10/20 职场文书
健康状况证明模板
2014/10/23 职场文书
运动会报道稿大全
2015/07/23 职场文书
Python 实现Mac 屏幕截图详解
2021/10/05 Python