监测局域网内主机的IP、MAC地址的异动变化并记录在Excel表格内
# -*- coding: utf-8 -*-
from scapy.all import *
import time
from openpyxl import load_workbook
import threading,os
R = threading.Lock() #线程锁
threa_num = 50 #线程数
def get_mac(ip):
try:
ans,unans=srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst=ip),timeout=2,verbose=False) #发送ARP请求包,verbose=False的话,就不显示发包信息
for send,rec in ans:
ip_mac=rec.sprintf("{ARP:%ARP.psrc%-%Ether.src%}") #将包按照固定的格式打印
return ip_mac.split("-")[1]
except Exception as e:
print("异常对象的类型是:%s"%type(e))
print("异常对象的内容是:%s"%e)
return None
def run(ip,row,old_mac):
global change_list
global ip_list
global R
new_mac = None
new_mac = get_mac(ip) #方法一
print(">>> ",ip,old_mac,new_mac)
with R:
old_ip = ""
if not new_mac == old_mac:
if not new_mac == None:
#两次mac不同把记录下来
for i in ip_list:
# print(i," ",new_mac,ip_list[i]["old_mac"])
if new_mac == ip_list[i]["old_mac"]:
old_ip = i
change_list.append({
"old_ip" :old_ip,
"new_ip": ip,
"old_mac": old_mac,
"new_mac":new_mac,
"change_date":time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()),
"old_index":row
})
# print(old_ip,ip,old_mac,new_mac)
if __name__ =='__main__':
file = "/data/mac_change/MacChange.xlsx"
wb = load_workbook(file)
sheet = wb.get_sheet_by_name('Sheet1')
sheet1 = wb.get_sheet_by_name('mac')
max_column1 = sheet1.max_row+1
ip_list = {}
change_list = []
for row in range(1,sheet.max_row+1):
if row == 1:
continue
old_mac = sheet.cell(row = row, column = 2).value
ip = sheet.cell(row = row, column = 1).value
ip_list[ip] = {"index":row,"old_mac":old_mac}
# print("ip_list: ",len(ip_list),"sheet.max_row: ",sheet.max_row-1)
for i,j in ip_list.items():
threading.Thread(target=run,args=(i,ip_list[i]["index"],ip_list[i]["old_mac"],)).start()
while True:
if len(threading.enumerate())>threa_num: #进程数
time.sleep(5)
else:
break
else:
while True:
if len(threading.enumerate())>=2: #进程数
time.sleep(2)
else:
for i in change_list:
sheet1.cell(row = max_column1, column = 1).value = i["old_ip"]
sheet1.cell(row = max_column1, column = 2).value = i["new_ip"]
sheet1.cell(row = max_column1, column = 3).value = i["old_mac"]
sheet1.cell(row = max_column1, column = 4).value = i["new_mac"]
sheet1.cell(row = max_column1, column = 5).value = i["change_date"]
max_column1+=1
#修改原来的mac
sheet.cell(row = i["old_index"], column = 2).value = i["new_mac"]
break
wb.save(file)
print("保存完成".center(30,"-"))
需要自己建个定时任务来循环执行



浙公网安备 33010602011771号