我正在尝试使用 Raspberry Pi 查找来自网络上特定无线设备的 ARP 请求。这是亚马逊破折号按钮之一。有人使用此代码来监听仪表板何时连接到 wifi。
from scapy.all import *
def arp_display(pkt):
if pkt[ARP].op == 1: #who-has (request)
if pkt[ARP].psrc == '0.0.0.0': # ARP Probe
if pkt[ARP].hwsrc == '74:75:48:5f:99:30': # button 1
print "Pushed Huggies"
elif pkt[ARP].hwsrc == '10:ae:60:00:4d:f3': # button 2
print "Pushed Elements"
else:
print "ARP Probe from unknown device: " + pkt[ARP].hwsrc
print sniff(prn=arp_display, filter="arp", store=0, count=10)
当我在 Raspbian 上运行此程序(安装了 python 和 scapy)时,出现错误
"IndexError: Layer [ARP] not found"
我对 scapy 完全不熟悉,只是第一次接触。感谢您的任何想法。
答案1
我也在做同样的事情。我发现tcpdump
没有安装。
一个简单的方法sudo apt-get install tcpdump
为我修复了这个错误。
答案2
我有同样的错误,但发现它不会可靠地发生,有时它会立即失败:
IndexError: Layer [ARP] not found
有时它会永远运行。
提示:count=0
在打印嗅探行中设置使其永远运行,计数似乎超时。
我最初从网站安装了 scapy,但最终做了:
apt-get update
apt-get upgrade
apt-get install tcpdump tcpreplay wireshark python-scapy
而且运行时似乎运行得很好。不确定我是否需要上述所有内容,但 python-scapy 在我安装时推荐了它们(以及一堆图形例程)。
附录:每次我摆弄代码时,它运行时不会发生崩溃的可能性,所以发生了一些非常奇怪的事情。
答案3
我们在这里遇到了同样的问题,结果我们忘记检查一个条件。
只需在所有 if 块之前添加这一行:
if pkt.haslayer(ARP):
答案4
在我的 Raspy B 2012 上,它占用了超过 50% 的 CPU。
我尝试的是
sniff(filter="tcp 和端口 123", prn=print_summary,store=0)
我通过防火墙将 Dash 按钮请求重定向到运行 Scapy 的计算机的 IP。这个想法是为了节省资源,而不是监视 mac 地址的所有流量,而只是监视端口上的连接请求。
这会消耗约 30% 的 CPU。它可以在 Ubuntu 机器上运行,但在 Raspi B 上大约需要 5 分钟才能开始工作,然后显示来自我的整个网络的连接 - 而在 Ubuntu 机器上则不然。我认为它在 Raspy Musicbox 图像上损坏了。