[TOC]0。前言一般情况下,如果要查看电脑的网卡IP地址或MAC地址,可以直接通过界面找到网卡查看,也可以使用linux的ifconfig等命令获取IP等信息,所以本节将教大家如何通过python获取网卡的IP/MAC信息。一、测试环境及关键代码说明1.1测试环境1.1.1系统:Ubuntu16.04.6LTSWindows10x641.1.2开发工具:pycharm专业版备注:专业版支持本地远程linux调试。2.模块介绍与演示这次只需要3个模块,但是比较费力。netifaces//需要安装,主要用于获取网卡接口的IP/MAC等信息;winreg//内置模块,主要用于Windows系统通过注册表获取网卡接口键值;platform//内置模块,主要用于判断系统类型:如Widows、Linux、MacOS等;2.1平台模块使用示例Linux系统:importplatformplatform.system()'Linux'#returnresultWindows系统:importplatformplatform.system()'Windows'#returnresult2.2netifaces模块外使用示例请参考网上安装方法,这里忽略(很简单)。用途:用于收集网络接口(IP/地址/网关)等信息。netiface模块定义了3个函数:defgateways(*args,**kwargs):#获取网关代码块defifaddresses(*args,**kwargs):#获取IP信息代码块definterfaces(*args,**kwargs):#获取接口ID代码块先看地址族:#!/usr/bin/envpython3#-*-coding:UTF-8-*-#欢迎关注微信公众号:滴滴科技#下面是Linux环境下的demo来自netifacesimportpprintpp=pprint.PrettyPrinter(indent=4)#这里使用pprint输出会更直观pp.pprint(netifaces.address_families)#returnresults:{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.1Linux环境请自行研究环境中如何获取网卡端口信息#!/usr/bin/envpython3#-*-coding:UTF-8-*-#欢迎关注微信公众号:滴滴科技importnetifacesimportpprintpp=pprint.PrettyPrinter(indent=4)netifaces.interfaces()['lo','ens32']#返回结果,ubuntu系统网卡IDpp.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:[{'地址':'00:0c:29:5d:2f:55','广播':'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'#返回结果,获取IPv4MAC地址netifaces.ifaddresses('ens32')[netifaces.AF_INET6][0]['addr']'fe80::20c:29ff:fe5d:2f55%ens32'#返回结果,获取IPv6地址2.2.2Windows环境下如何获取网卡端口信息:获取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大致分为:primarykey--subkey--keyvalue这次用到的函数:winreg.ConnectRegistry(computer_name,key):连接注册表,computer_name=None表示本地电脑,否则r"\\computername”表示远程计算机,key是key的链接。winreg.OpenKey(key,sub_key,reserved=0,access=KEY_READ):打开指定的key,key已经打开的key,sub_key要打开的key。winreg.QueryValueEx(key,value_name):检索与注册表项关联的指定值名称的类型和数据。Windows环境下获取接口信息的方法:#下面是Windows环境下importnetifacesimportpprintpp=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}','{A770-4-7-B2E0-1D0F483FD64E}','{CD94297B-D746-4494-91F7-3E40C091A0FC}',#剧透,这是无线网卡WLAN唯一的子键'{652C7833-4B8D-400F-A72F-F7C89C30FD03}','{991AF727-67ED-11E9-B14B-806E6F6E6963}']#请先记住我的无线网卡的WLANkey是:{CD94297B-D746-4494-91F7-3E40C091A0FC}#后面会介绍如何获取;#先看看在获取ipv4相关信息:pp.pprint(netifaces.ifaddresses('{CD94297B-D746-4494-91F7-3E40C091A0FC}')[netifaces.AF_INET]#returnresult[{'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/envpython3#-*-coding:UTF-8-*-#欢迎关注微信公众号:滴滴技术fromnetifacesimportinterfacesimportwinregaswr#Define得到Windows系统注册表中网卡接口键值的作用defget_key(ifname):#获取所有网卡的键值id=interfaces()#存储网卡的字典键值和键名key_name={}try:#establishLinkregistry,"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('Patherrororotherproblems,请仔细检查')foriinid:try:#尝试读取每个网卡键值下对应的Namereg_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])exceptFileNotFoundError:pass#print('所有接口信息字典列表:'+str(key_name)+'\n')returnkey_name[ifname]if__name__=='__main__':print(get_key('WLAN'))文件2:python_netifaces.py描述:在Windows和Linux系统上运行使用#!/usr/bin/envpython3#-*-coding:UTF-8-*-#欢迎关注微信公众号:滴滴技术fromnetifacesimportifaddresses,AF_INET,AF_INET6importplatform#获取ipv4信息的函数定义defget_ip_address(ifname):#判断系统是否为Linuxifplatform.system()=="Linux":try:#返回ipv4地址信息returnifaddresses(ifname)[AF_INET][0]['addr']exceptValueError:returnNone#判断是否是Windows系统elifplatform.system()=="Windows":#调用get_key函数,从Tools.win_get_key中获取网卡的key值importget_keykey=get_key(ifname)ifnotkey:returnelse:#返回ipv4地址信息returnifaddresses(key)[AF_INET][0]['addr']#判断是否为Windows系统elifplatform.system()=='MacOS':passelse:print('本程序暂时不支持你的系统,目前只支持Linux,Windows,MacOS')#定义获取ipv6信息的函数,和上面的函数大致相同,不加备注defget_ipv6_address(ifname):ifplatform.system()=="Linux":try:returnifaddresses(ifname)[AF_INET6][0]['addr']除了ValueError:返回无elifplatform.system()=="Windows":fromTools.win_get_keyimportget_keykey=get_key(ifname)如果不是key:returnelse:returnifaddresses(key)[AF_INET6][0]['addr']elifplatform.system()=='MacOS':passelse:print('您的系统暂时不支持此程序,目前只支持Linux,Windows,macOS')if__name__=='__main__':print('你的ipv4地址是:'+get_ip_address('WLAN'))print('你的ipv6地址是:'+get_ipv6_address('WLAN'))#下返回的结果Windows系统:你的ipv4添加ress是:192.168.100.203你的ipv6地址是:240e:64:5222:2000:5d68:304d:6133:ab45Linux系统下返回结果:...省略...省略代码(同上)...if__姓名__=='__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%ens324。破语言这次有点长,我用的是分解希望对大家有用,而不是在自己写的每篇文章里都只贴脚本,希望对于网络攻城狮来说,如何使用python更好的提升工作效率和运维,不仅限于传统的局域网、广域网等,而且技术迭代更新,个人技能和思维需要与时俱进,共同进步。4.1官方参考链接:netifaces模块:https://pypi.org/project/netifaces/winreg模块:https://docs.python.org/3/library/winreg.html#exception-changed如果你喜欢我的文章,欢迎关注我的公众号:点滴科技,扫码关注,不定时分享
