用python查找统一局域网下ip对应的mac地址
MAC地址也叫物理地址、硬件地址,由网络设备制造商生产时烧录在网卡(NetworklnterfaceCard)的EPROM(一种闪存芯片,通常可以通过程序擦写)。IP地址与MAC地址在计算机里都是以二进制表示的,IP地址是32位的,而MAC地址则是48位的[3] 。
MAC地址的长度为48位(6个字节),通常表示为12个16进制数,如:00-16-EA-AE-3C-40就是一个MAC地址,其中前3个字节,16进制数00-16-EA代表网络硬件制造商的编号,它由IEEE(电气与电子工程师协会)分配,而后3个字节,16进制数AE-3C-40代表该制造商所制造的某个网络产品(如网卡)的系列号。只要不更改自己的MAC地址,MAC地址在世界是唯一的。形象地说,MAC地址就如同身份证上的身份证号码,具有唯一性
我们可以编写如下python代码来查询
#arp扫描,定义一个函数,发送两层的arp包,请求同一局域网内其他IP地址的mac地址。 fromscapy.allimport* importuuid,socket #获取本机的IP地址。 defget_ip_address(): #获取本机电脑名 myname=socket.getfqdn(socket.gethostname()) #获取本机ip myaddr=socket.gethostbyname(myname) returnmyaddr #获取本机的mac地址。 defget_mac_address(): mac=uuid.UUID(int=uuid.getnode()).hex[-12:] return":".join([mac[e:e+2]foreinrange(0,11,2)]) #arp扫描,获取统一局域网下的IP地址的mac地址。 defarp_scan(ip): #获取本机的mac地址。 local_mac=get_mac_address() #获取本机的ip地址。 local_ip=get_ip_address() #print(type(local_ip),type(local_mac)) #分隔IP地址。 ip_split=ip.split('.') ip_list=[] #进行重新定义ip地址段。 foriinrange(1,25): ip_list.append(ip_split[0]+'.'+ip_split[1]+'.'+ip_split[2]+'.'+str(i)) print(ip_list,local_ip,local_mac) #arp_result=srp(Ether(src=local_mac,dst='ff:ff:ff:ff:ff:ff')/ARP(op=1,hw='00:00:00:00:00:00',psrc=local_ip,pdst=ip_list),timeout=1,verbose=False) #构造二层包,写入以太网层,这里每一层包需要填什么字段,可以取scapy界面看一下。 arp_result=srp(Ether(src=local_mac,dst='ff:ff:ff:ff:ff:ff')/ARP(op=1,hwsrc=local_mac,hwdst='00:00:00:00:00:00',psrc=local_ip,pdst=ip_list),timeout=1,verbose=False) #进行解包操作。 mac_result=arp_result[0].res mac_list=[] #找到对应的IP地址和MAC地址。 foriinrange(len(mac_result)): ip=mac_result[i][1][1].fields['psrc'] mac=mac_result[i][1][1].fields['hwsrc'] mac_list.append([ip,mac]) returnmac_list if__name__=="__main__": ip='192.168.156.1' mac_list=arp_scan(ip) foriinrange(len(mac_list)): print("IP地址:",mac_list[i][0],'MAC地址:',mac_list[i][1])
以上就是用python查找统一局域网下ip对应的mac地址的详细内容,更多关于python查找mac地址的资料请关注毛票票其它相关文章!