如何通过Scapy指定接口发送广播MAC地址执行ping操作
报错根因
核心是混淆了Scapy两个二层报文发送方法的返回值规则:
srp()发送报文后返回(已应答报文对, 未应答报文)二元组,可直接用两个变量接收srp1()仅返回第一个收到的应答报文(单个对象),不存在二元组结构,所以用两个变量接收会触发解包报错
可行解决方案
1. 全量扫描网段(适配你扫192.168.1.0/24的需求,支持指定接口)
改用srp()方法,新增iface参数指定你要使用的网卡:
# 将iface参数的值替换为你的实际网卡名,Linux常见为ens33/eth0,Windows常见为"以太网" ans, unans = srp(Ether(dst="ff:ff:ff:ff:ff:ff")/IP(dst="192.168.1.0/24")/ICMP(), timeout=2, iface="eth0")
2. 正确打印扫描结果
你之前调用ans.summary时用了ARP.psrc字段,你发送的是ICMP报文而非ARP请求,无ARP字段,修改为IP层字段即可:
ans.summary(lambda s,r: r.sprintf("%Ether.src% %IP.src%") )
3. 仅需要第一个应答的极简写法
如果只需要获取第一个响应的设备,直接用单个变量接收srp1()返回值即可:
# 同样替换iface为实际网卡名 resp = srp1(Ether(dst="ff:ff:ff:ff:ff:ff")/IP(dst="192.168.1.0/24")/ICMP(), timeout=2, iface="eth0") if resp: print(resp.sprintf("%Ether.src% %IP.src%"))
内容的提问来源于stack exchange,提问作者michal shalman
相关产品推荐
相关产品推荐

