python 获取计算机的网卡信息

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 获取网卡信息的资料请关注我们其它相关文章!

(0)

相关推荐

  • python使用WMI检测windows系统信息、硬盘信息、网卡信息的方法

    本文实例讲述了python使用WMI检测windows系统信息.硬盘信息.网卡信息的方法.分享给大家供大家参考.具体实现方法如下: #!/usr/bin/env python # -*- coding: utf-8 -*- import wmi import sys,time,platform def get_system_info(os): """ 获取操作系统版本. """ print print "Operating system

  • Linux服务器网卡流量查看方法 shell和Python各一枚

    有时我们需要较为实时的查看服务器上的网卡流量,这里我写了两个小脚本,一个用shell(先写的,一次只能查看一个网卡),另一个用Python(后写的,一次可查看多个网卡). 脚本中都用了while true"死循环",每隔10s从"/proc/net/dev"中取一次值并根据10s内的差值计算10s内的平均带宽:按ctrl+c停止执行.脚本兼容centos6和7 两个脚本都不太复杂,而且脚本中注释也比较细致,所以我就不过多解释脚本内容了. 直接上图上脚本: shell

  • Python获取本机所有网卡ip,掩码和广播地址实例代码

    本文主要研究的是使用Python获取本机所有网卡ip,掩码和广播地址,分享了相关的实例代码,具体介绍如下. 搜了一天,竟然没找到一段合适的代码来获取机器中所有网卡的ip,掩码和广播地址,大部分都是用socket,但是socket通常返回的要不就是内网地址,要不就是公网地址,不能够找到所有地址,真的太忧桑了,决定自己通过ifconfig或ipconfig的返回信息,一步步地过滤了.这次的代码主要用到了正则表达式和subprocess模块,而且为了兼容所有平台(win,linux和mac),也用到了

  • Python脚本实现网卡流量监控

    #/usr/bin/env/python #coding=utf-8 import sys,re,time,os maxdata = 50000 #单位KB memfilename = '/tmp/newnetcardtransdata.txt' netcard = '/proc/net/dev' def checkfile(filename): if os.path.isfile(filename): pass else: f = open(filename, 'w') f.write('0'

  • python监控网卡流量并使用graphite绘图的示例

    复制代码 代码如下: #!/usr/bin/env pythonimport sys,timefrom socket import socketdef read_interface(in_file):    with file(in_file) as f:        return f.readlines()[2:]def set_interface(inter_msg):    dic={}    for i in xrange(len(inter_msg)):        dic[int

  • python 的 scapy库,实现网卡收发包的例子

    问题: 测试时 收发流采用TestCenter.SmartBit等仪表来进行.如果仍采用其进行自动化冒烟,则会带来效率低.成本高的问题. 解决方案: 采用网卡来收发流,虽然有性能统计上的缺陷,但可以验证一些基本功能,且经济. 采用scapy模块, 1-获取计算机网卡的iface,并预先设计好用哪些iface进行收发流: 2-conf.L2listen对各个iface进行监听 3-subprocess.Popen来调用tShark.exe启动抓包,也可以调用ping.exe构造ping包 4-se

  • Python 使用指定的网卡发送HTTP请求的实例

    需求: 一台机器上有多个网卡, 如何访问指定的 URL 时使用指定的网卡发送数据呢? $ curl --interface eth0 www.baidu.com # curl interface 可以指定网卡 阅读 urllib.py 的源码, 追述到 open_http –> httplib.HTTP –> httplib.HTTP._connection_class = HTTPConnection HTTPConnection 在创建的时候会指定一个 source_address. HT

  • Python选择网卡发包及接收数据包

    当一台计算机上有多个网卡时,需要选择对应IP地址的网卡进行发送数据包或者接受数据包. 1.选择网卡发包(应用scapy): plface=conf.route.route("××.××.××.××")[0] #××.××.××.××为对应网卡网络中存在设备的IP地址.不能是需要发送数据包的网卡的IP地址(会报"result too large") pkt=conf.L2socket(plface) pack_ip,pack_udp,pack_ether=self.u

  • Python简单获取网卡名称及其IP地址的方法【基于psutil模块】

    本文实例讲述了Python简单获取网卡名称及其IP地址的方法.分享给大家供大家参考,具体如下: windows上想知道网卡和IP地址,可以使用ipconfig命令,在linux上可以使用ifconfig命令,得到输出后,可以解析输出内容,我要介绍的方法更为简单,只需要安装一个名为psutil的第三方库即可 # -*- coding: utf-8 -*- #! python2 import psutil #获取网卡名称和其ip地址,不包括回环 def get_netcard(): netcard_

  • python 获取计算机的网卡信息

    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

  • 如何用Python获取计算机名,ip地址,mac地址

    获取计算机名 # 获取计算机名,常用的方法有三种,但最常用的是第一种 import os import socket # method one name = socket.gethostname() print(name) # hanser # method two name = os.popen("hostname").read() print(name) # hanser # method three name = os.environ.get("COMPUTERNAME

  • python获取当前计算机cpu数量的方法

    本文实例讲述了python获取当前计算机cpu数量的方法.分享给大家供大家参考.具体分析如下: 这里实际上返回的是计算机的cpu核心数,比如cpu是双核的,则返回2,如果双四核cpu,则返回8 from multiprocessing import cpu_count print(cpu_count()) 本机是四核电脑,返回结果:4 希望本文所述对大家的Python程序设计有所帮助.

  • python获取本地计算机名字的方法

    本文实例讲述了python获取本地计算机名字的方法.分享给大家供大家参考.具体如下: import sys, socket hostname = socket.gethostname() print "Host name:", hostname 希望本文所述对大家的Python程序设计有所帮助.

  • Python获取CPU、内存使用率以及网络使用状态代码

    由于psutil已更新到3.0.1版本,最新的代码如下: #!/usr/bin/env python import os import time import sys import atexit import psutil #print "Welcome,current system is",os.name," 3 seconds late start to get data" time.sleep(3) line_num = 1 #function of Get

  • 使用Python获取网段IP个数以及地址清单的方法

    使用Python获取网段的IP个数以及地址清单需要用到IPy的库,而相应的方法主要就是IP. 写小脚本如下: from IPy import IP ip = IP('192.168.0.0/16') print(ip.len()) for x in ip: print(x) 运行结果: GreydeMac-mini:01_系统基础信息模块详解 greyzhang$ python ip.py 65536 192.168.0.0 192.168.0.1 192.168.0.2 192.168.0.3

  • Python获取某一天是星期几的方法示例

    本文实例讲述了Python获取某一天是星期几的方法.分享给大家供大家参考,具体如下: 这里以2017年的春节(1月28号)为例: import re; import time; import datetime; if(__name__=="__main__"): #today=int(time.strftime("%w")); anyday=datetime.datetime(2017,1,28).strftime("%w"); print an

  • python获取指定目录下所有文件名列表的方法

    本文实例讲述了python获取指定目录下所有文件名列表的方法.分享给大家供大家参考.具体实现方法如下: 这里python代码实现获取文件名列表的功能,可以指定文件中包含的字符,方便提取特定类型的文件名列表: # -*- coding: utf-8 -*- #~ #------------------------------------------------------------------ #~ module:wlab #~ Filename:wgetfilelist.py #~ Funct

  • Python获取文件ssdeep值的方法

    本文实例讲述了Python获取文件ssdeep值的方法,分享给大家供大家参考.具体方法如下: 首先,得到ssdeep值,需要先import ssdeep 在ubuntu上安装pyssdeep时 一直出错  后来发现apt-cache search "ssdeep"时把几个全apt-get install 上,但问题依旧. 后来下载到pyssdeep的源文件 ,tar zxvf pyssdeep.tar.zip 然后 apt-get install python-dev 然后 pytho

  • 利用Python获取操作系统信息实例

    前言 每一位运维人员都应该对自己所管理的机器配置很清楚,因为这对我们快速处理问题很有帮助,比如随着业务增长,突然某些机器负载上涨的厉害,这时候要排查原因,除了从应用程序.架构上分析外,当前硬件性能的分析应该是必不可少的一环,今天我们将不用第三方模块,用python自带模块和系统提供的运行信息来获取我们需要的信息,这个脚本除了硬件外,还抓取了当前系统进程数和网卡流量功能,所以这个版本实现的功能基本对应了之前psutil实现的内容,多的不说了,直接贴代码: #!/usr/bin/env python

随机推荐