• 售前

  • 售后

热门帖子
入门百科

python 获取盘算机的网卡信息

[复制链接]
紫色爱玫瑰咎 显示全部楼层 发表于 2021-10-25 19:21:10 |阅读模式 打印 上一主题 下一主题
目录


  • 0. 前言
  • 1. 测试情况及关键代码解释

    • 1.1 测试情况

  • 2. 模块介绍及演示

    • 2.1 platform模块利用示例
    • 2.2 netifaces模块利用示例

  • 3. 完整代码
  • 4. 碎碎语

    • 4.1 官方参考链接:


0. 前言


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

1. 测试情况及关键代码解释



1.1 测试情况


1.1.1 体系:
  1. Ubuntu 16.04.6 LTS
  2. Windows 10 x64
复制代码
1.1.2 开辟工具:
  1. pycharm 专业版
  2. 备注:专业版支持本地远程linux调试。
复制代码
2. 模块介绍及演示


本次只需要用到3个模块就搞定,但也是挺费劲的咯。
      
  • netifaces //需要安装,主要用于获取网卡接口IP/MAC等信息;  
  • winreg //内置模块,主要用于Windows体系通过注册表获取网卡接口键值;  
  • platform //内置模块,主要用于判断体系范例:如Widows、Linux、MacOS等;

2.1 platform模块利用示例


Linux体系:
  1. import platform
  2. platform.system()
  3. 'Linux'  #返回结果
复制代码
Windows体系:
  1. import platform
  2. platform.system()
  3. 'Windows'  #返回结果
复制代码
2.2 netifaces模块利用示例


外置模块,安装方式请参考网上,此处忽略(很简朴)。
用处:用于网络网络接口等信息(IP/地点/网关)。
netiface模块定了3个函数:
  1. def gateways(*args, **kwargs):  #获取网关
  2. 代码块
  3. def ifaddresses(*args, **kwargs): #获取IP信息
  4. 代码块
  5. def interfaces(*args, **kwargs): #获取接口ID
  6. 代码块
复制代码
先看下地点族:
  1. #!/usr/bin/env python3
  2. #-*- coding:UTF-8 -*-
  3. #欢迎关注微信公众号:点滴技术
  4. #以下在Linux环境下演示
  5. from netifaces
  6. import pprint
  7. pp = pprint.PrettyPrinter(indent=4)  #这里使用pprint输出会更直观
  8. pp.pprint(netifaces.address_families)
  9. #返回结果:
  10. { 0: 'AF_UNSPEC',
  11. 1: 'AF_FILE',
  12. 2: 'AF_INET',        #ipv4地址
  13. 3: 'AF_AX25',
  14. 4: 'AF_IPX',
  15. 5: 'AF_APPLETALK',
  16. 6: 'AF_NETROM',
  17. 7: 'AF_BRIDGE',
  18. 8: 'AF_ATMPVC',
  19. 9: 'AF_X25',
  20. 10: 'AF_INET6',        #ipv6地址
  21. 11: 'AF_ROSE',
  22. 12: 'AF_DECnet',
  23. 13: 'AF_NETBEUI',
  24. 14: 'AF_SECURITY',
  25. 15: 'AF_KEY',
  26. 16: 'AF_NETLINK',       
  27. 17: 'AF_PACKET', #ipv4的MAC地址
  28. 18: 'AF_ASH',
  29. 19: 'AF_ECONET',
  30. 20: 'AF_ATMSVC',
  31. 22: 'AF_SNA',
  32. 23: 'AF_IRDA',
  33. 24: 'AF_PPPOX',
  34. 25: 'AF_WANPIPE',
  35. 31: 'AF_BLUETOOTH'}
  36. #这里大家重点关注下:AF_NET、AF_NET6
  37. #其他的大家自己去研究下
复制代码
2.2.1 Linux情况下怎样获取网卡口的信息
  1. #!/usr/bin/env python3
  2. #-*- coding:UTF-8 -*-
  3. #欢迎关注微信公众号:点滴技术
  4. import netifaces
  5. import pprint
  6. pp = pprint.PrettyPrinter(indent=4)
  7. netifaces.interfaces()
  8. ['lo', 'ens32']   #返回结果,ubuntu系统网卡ID
  9. pp.pprint(netifaces.ifaddresses('ens32'))
  10. #返回结果,是一个字典,字典中又嵌套列表,所以切片的时候要注意
  11. { 2: [ { 'addr': '192.168.0.253',
  12.     'broadcast': '192.168.0.255',
  13.     'netmask': '255.255.255.0'}],
  14. 10: [ { 'addr': 'fe80::20c:29ff:fe5d:2f55%ens32',
  15.     'netmask': 'ffff:ffff:ffff:ffff::/64'}],
  16. 17: [{'addr': '00:0c:29:5d:2f:55', 'broadcast': 'ff:ff:ff:ff:ff:ff'}]}
  17. netifaces.ifaddresses('ens32')[netifaces.AF_INET][0]['addr']
  18. '192.168.0.253'  #返回结果,获取到IPv4地址
  19. netifaces.ifaddresses('ens32')[netifaces.AF_PACKET][0]['addr']
  20. '00:0c:29:5d:2f:55'  #返回结果,获取到IPv4的MAC地址
  21. netifaces.ifaddresses('ens32')[netifaces.AF_INET6][0]['addr']
  22. 'fe80::20c:29ff:fe5d:2f55%ens32'  #返回结果,获取到IPv6地址
复制代码
2.2.2 Windows情况下怎样获取网卡口的信息
说明:windows取值相比Linux复杂多了,不能直接根据接口获取ip信息,需要先找到一串唯一的键值,然后才能依据它获取到接口IP信息,这里我先给出示例,省得大家看了一头雾水:
我的无线网卡信息:
无线网卡名称:WLAN
注册表上对应的键值:{CD94297B-D746-4494-91F7-3E40C091A0FC} //python需要知道这个
注册表需要用到了【winreg】模块,咱们照旧先简朴聊下Windows的注册表结构吧。
  1.   >-----HKEY_CLASSES_ROOT
  2.   >-----HKEY_CURRENT_USER
  3. 注册表 >-----HKEY_LOCAL_MACHINE
  4.   >-----HKEY_USERS
  5.   >-----HKEY_CURRENT_CONFIG
  6. 大体分为:主键--子键--键值
  7. 本次用到的函数:
  8. winreg.ConnectRegistry(computer_name, key):
  9. 连接注册表,computer_name=None表示本地计算机,否则用r"\\computername"表示远程计算机,key为键的链接。
  10. winreg.OpenKey(key, sub_key, reserved=0, access=KEY_READ):
  11. 打开指定的键,key已经打开的键,sub_key要打开的键。
  12. winreg.QueryValueEx(key,value_name ):
  13. 检索注册表项关联的指定值名称的类型和数据。
复制代码
在Windows情况怎样获取接口信息:
  1. #以下在Windows环境下
  2. import netifaces
  3. import pprint
  4. pp = pprint.PrettyPrinter(indent=4)
  5. pp.pprint(netifaces.interfaces())
  6. #返回结果:是个列表,都是一串子键... 这一 一对应网卡来的
  7. [ '{90788744-5655-4A9E-ADB6-A97CAE0F3B3F}',
  8. '{02685473-BCE5-4E19-AC64-0388FA81C13F}',
  9. '{5BBD6405-7C2E-4A78-8A09-31E03FAA3B75}',
  10. '{95FDA148-CA04-4926-87CD-FC0DC38FF89C}',
  11. '{D87FBBE0-11C0-49D1-A8CE-52DFC195B1B4}',
  12. '{E31B9D7C-6E73-4773-B564-1038BDB0EDAD}',
  13. '{A7584008-7824-4760-B2E0-1D0F483FD64E}',
  14. '{CD94297B-D746-4494-91F7-3E40C091A0FC}', #剧透,这个就是无线网卡WLAN的唯一子键
  15. '{652C7833-4B8D-400F-A72F-F7C89C30FD03}',
  16. '{991AF727-67ED-11E9-B14B-806E6F6E6963}']
  17. #请先记住我的无线网卡WLAN的键是: {CD94297B-D746-4494-91F7-3E40C091A0FC}
  18. #后面会介绍怎么获取;
  19. #先看下获取ipv4相关的信息:
  20. pp.pprint(netifaces.ifaddresses('{CD94297B-D746-4494-91F7-3E40C091A0FC}')[netifaces.AF_INET]
  21. #返回结果
  22. [ { 'addr': '172.20.18.37',
  23.   'broadcast': '172.20.18.255',
  24.   'netmask': '255.255.255.0'}]
  25.   
  26. #获取ipv4地址  
  27. pp.pprint(netifaces.ifaddresses('{CD94297B-D746-4494-91F7-3E40C091A0FC}')[netifaces.AF_INET][0]['addr'])
  28. '172.20.18.37' #返回结果
复制代码
3. 完整代码


文件1:win_get_key.py
说明:windows体系上运行利用
  1. #!/usr/bin/env python3
  2. #-*- coding:UTF-8 -*-
  3. #欢迎关注微信公众号:点滴技术
  4. from netifaces import interfaces
  5. import winreg as wr
  6. #定义获取Windows系统网卡接口的在注册表的键值的函数
  7. def get_key(ifname):
  8. #获取所有网络接口卡的键值
  9. id = interfaces()
  10. #存放网卡键值与键值名称的字典
  11. key_name = {}
  12. try:
  13.   #建立链接注册表,"HKEY_LOCAL_MACHINE",None表示本地计算机
  14.   reg = wr.ConnectRegistry(None,wr.HKEY_LOCAL_MACHINE)
  15.   # 打开r'SYSTEM\CurrentControlSet\Control\Network\{4d36e972-e325-11ce-bfc1-08002be10318}',固定的
  16.   reg_key = wr.OpenKey(reg , r'SYSTEM\CurrentControlSet\Control\Network\{4d36e972-e325-11ce-bfc1-08002be10318}')
  17. except :
  18.   return ('路径出错或者其他问题,请仔细检查')
  19. for i in id:
  20.   try:
  21.    #尝试读取每一个网卡键值下对应的Name
  22.    reg_subkey = wr.OpenKey(reg_key , i + r'\Connection')
  23.    #如果存在Name,写入key_name字典
  24.    key_name[wr.QueryValueEx(reg_subkey , 'Name')[0]] = i
  25.    # print(wr.QueryValueEx(reg_subkey , 'Name')[0])
  26.   except FileNotFoundError:
  27.    pass
  28. # print('所有接口信息字典列表: ' + str(key_name) + '\n')
  29. return key_name[ifname]
  30. if __name__ == '__main__':
  31. print(get_key('WLAN'))
复制代码
文件2:python_netifaces.py
说明:在Window和Linux体系上运行利用
  1. #!/usr/bin/env python3
  2. #-*- coding:UTF-8 -*-
  3. #欢迎关注微信公众号:点滴技术
  4. from netifaces import ifaddresses ,AF_INET , AF_INET6
  5. import platform
  6. #定义获取ipv4信息的函数
  7. def get_ip_address(ifname):
  8. #判断系统是否为Linux
  9. if platform.system() == "Linux":
  10.   try:
  11.    #返回ipv4地址信息
  12.    return ifaddresses(ifname)[AF_INET][0]['addr']
  13.   except ValueError:
  14.    return None
  15. #判断是否为Windows系统
  16. elif platform.system() == "Windows":
  17.   #调用函数get_key,获取到了网卡的键值
  18.   from Tools.win_get_key import get_key
  19.   key = get_key(ifname)
  20.   if not key:
  21.    return
  22.   else:
  23.    #返回ipv4地址信息
  24.    return ifaddresses(key)[AF_INET][0]['addr']
  25. # 判断是否为Windows系统
  26. elif platform.system() == 'MacOS':
  27.   pass
  28. else:
  29.   print('您的系统本程序暂时不支持,目前只支持Linux、Windows、MacOS')
  30. #定义获取ipv6信息的函数,与上面函数大体一致,不备注
  31. def get_ipv6_address(ifname):
  32. if platform.system() == "Linux":
  33.   try:
  34.    return ifaddresses(ifname)[AF_INET6][0]['addr']
  35.   except ValueError:
  36.    return None
  37. elif platform.system() == "Windows":
  38.   from Tools.win_get_key import get_key
  39.   key = get_key(ifname)
  40.   if not key:
  41.    return
  42.   else:
  43.    return ifaddresses(key)[AF_INET6][0]['addr']
  44. elif platform.system() == 'MacOS':
  45.   pass
  46. else:
  47.   print('您的系统本程序暂时不支持,目前只支持Linux、Windows、MacOS')
  48. if __name__ == '__main__':
  49. print('你的ipv4地址是:' + get_ip_address('WLAN'))
  50. print('你的ipv6地址是:' + get_ipv6_address('WLAN'))
  51. #Windows系统下返回的结果:
  52. 你的ipv4地址是:192.168.100.203
  53. 你的ipv6地址是:240e:64:5222:2000:5d68:304d:6133:ab45
复制代码
Linux体系下返回结果:
  1. ...省略...
  2. ...代码省略(同上)...
  3. if __name__ == '__main__':
  4. #切换到远程Linux环境下,修改如下:
  5. print('你的ipv4地址是:' + get_ip_address('ens32'))
  6. print('你的ipv6地址是:' + get_ipv6_address('ens32'))
  7. #Linux系统下返回的结果
  8. 你的ipv4地址是:192.168.0.253
  9. 你的ipv6地址是:fe80::20c:29ff:fe5d:2f55%ens32
复制代码
4. 碎碎语


本次篇幅有点多,我是接纳分解方式举行讲解,渴望对大家有效,而不是一把把脚本贴上来。
我写的每一篇文章,渴望对于网络攻城狮来说,能够怎样运用python更好的进步工作服从和运维,而不仅仅范围在传统的局域网、广域网等,技术再迭代更新,个人的技能头脑更需要贴合期间,共同进步。

4.1 官方参考链接:
  1. netifaces模块:
  2. https://pypi.org/project/netifaces/
  3. winreg模块:
  4. https://docs.python.org/3/library/winreg.html#exception-changed
复制代码
以上就是python 获取盘算机的网卡信息的详细内容,更多关于python 获取网卡信息的资料请关注草根技术分享别的相关文章!

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作