安装scapy库
pip install scapy -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple
扫描本机局域网的所有主机,输出IP/MAC对于表
# -*- coding: UTF-8 -*-
import netifaces
from scapy.all import srp
from scapy.layers.l2 import ARP, Ether
import ipaddress
def get_local_network():
"""获取本机IP段/掩码"""
ip_mask = []
for iface in netifaces.interfaces():
addrs = netifaces.ifaddresses(iface)
if netifaces.AF_INET in addrs:
for addr_info in addrs[netifaces.AF_INET]:
if 'addr' in addr_info and 'netmask' in addr_info:
ip = addr_info['addr']
mask = addr_info['netmask']
if ip != '127.0.0.1':
network = ipaddress.IPv4Network(f"{ip}/{mask}", strict=False)
netmask = sum(bin(int(x)).count('1') for x in mask.split('.'))
ip_mask.append(f"{network.network_address}/{netmask}")
return ip_mask
def scan_network(ip_range):
"""
扫描指定 IP 范围内的主机,获取 IP 和 MAC 地址的对应关系
:param ip_range: IP 范围,例如 "192.168.0.0/24"
:return: IP/MAC 对应表
"""
# ARP 请求包
arp_request = ARP(pdst=ip_range)
# 广播帧
ether_frame = Ether(dst="ff:ff:ff:ff:ff:ff")
# 数据包
packet = ether_frame / arp_request
# 发送并接收响应
result = srp(packet, timeout=3, verbose=0, filter="arp")[0]
# 解析结果
ip_mac_table = []
for sent, received in result:
ip = received.psrc
mac = received.hwsrc
ip_mac_table.append((ip, mac))
return ip_mac_table
def print_ip_mac_table(ip_mac_table):
"""
打印 IP/MAC 对应表
:param ip_mac_table: IP/MAC 对应表
"""
print("IP/MAC 对应表:")
print("-" * 35)
print(f"{'IP':<15}{'MAC':<17}")
print("-" * 35)
for ip, mac in ip_mac_table:
print(f"{ip:<15}{mac:<17}")
print("-" * 35)
if __name__ == "__main__":
ip_mac_table_result = []
for ip_range in get_local_network():
print(f"开始扫描 {ip_range} ...")
ip_mac_table_result += scan_network(ip_range)
print_ip_mac_table(ip_mac_table_result)
输出
开始扫描 192.168.0.0/24 ...
IP Address MAC Address
--------------------------------------
192.168.0.113 4c:5f:70:6d:db:ca