from scapy.all import *
import sys,getopt,socket
def get_local_net():
#获取网段。如:192.168.50
try:
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(('8.8.8.8', 80))
# 获取本机ip。如:192.168.50.110
ip = s.getsockname()[0]
ippre_list = ip.split(r".")
ippre_list.pop()
# 获取网段字串。如:192.168.50
ipnet = '.'.join(ippre_list)
except Exception:
ipnet = False
finally:
s.close()
return ipnet
def get_vlan_ip_and_mac(locnet,start_num=1,end_num=255):
# 通过arp协议扫描,发现本网段存活ip和mac
result = []
localnet = locnet
scansum=int(end_num)-int(start_num)+1
print("%s.%s - %s.%s 共计 %s 个被扫描ip"% (localnet,start_num,localnet,end_num,scansum))
print()
counter=1
# 如果无法识别本网段,则退出扫描
if not localnet:
print("扫描终止:无法识别本网段。")
return result
for ipFix in range(start_num,end_num+1):
# 构造本网段的ip。如:192.168.50.20
ip =localnet+"."+str(ipFix)
# 组合协议包
# 通过 '/' 可叠加多个协议层(左底层到右上层),如Ether()/IP()/UDP()/DNS()
arpPkt=Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst=ip)
# 发送arp请求,并获取响应结果。设置1s超时。
res = srp1(arpPkt,timeout=1,verbose=0)
# 如果ip存活
if res:
print("%3d --> %s %s"%(counter,ip, res.hwsrc))
result.append({"localIP":res.psrc,"mac":res.hwsrc})
counter+=1
# 如果ip不存活
else:
print("%3d --> %s"%(counter,ip))
counter+=1
return result
if __name__ == '__main__':
locnet=get_local_net()
print("一、开始扫描本网段(%s.xx)活动的ip" % locnet )
# 扫描ip起始和终止范围
start_num=126
end_num=135
# 开始扫描
result = get_vlan_ip_and_mac(locnet,start_num,end_num)
print()
print("二、Mac表汇总清单(活动ip共计 %s个):" % len(result))
for dic in result:
print(dic)