我正在使用 Scapy sniff 函数,我想在参数中添加一个过滤器。所以我添加了这个过滤器:
pkt = sniff(count=1, filter='arp')
我收到的输出是:
WARNING: Cannot set filter: libpcap is not available. Cannot compile filter !
我仍然收到一个被嗅探的数据包,但由于某种原因过滤器无法工作。
我正在运行 Mac OS Big Sur。我使用 Homebrew 安装了 libpcap,并使用 Homebrew 安装了 tcpdump。
我还在网上看到你可以使用
在Scapy上手动初始化pcapconf.use_pcap = True
但是,当我输入此内容时,我得到:
WARNING: No libpcap provider available ! pcap won't be used
我确信这只是一个小修复,但我似乎无法弄清楚我做错了什么。如果有人能提供帮助那就太棒了!
旧版本的 Python 3 假设在 macOS 上,所有共享库都位于位于多个目录之一的文件中。
大苏尔的情况不是;相反,系统共享库会生成一个缓存文件,并且至少有一些生成缓存文件的库不随操作系统一起提供。
这是CPython问题41100中的问题之一,“支持macOS 11和Apple Silicon Mac”;修复方法是查看共享库缓存以及文件系统。
该问题说
感谢所有为这项重大事业做出贡献的人! 特别感谢劳伦斯所做的大部分初始工作并铺平了道路。现在,从即将发布的 3.8.10 版本开始,3.8 也支持 Big Sur 和 Apple Silicon Mac,是时候解决这个问题了。如果出现新问题,请打开或使用其他问题。
因此足够新的 Python 版本应该可以解决这个问题。
$ brew install libpcap
$ ln -s /usr/local/opt/libpcap/lib/libpcap.a /usr/local/lib/libpcap.a
$ ln -s /usr/local/opt/libpcap/lib/libpcap.dylib /usr/local/lib/libpcap.dylib
当你调试 Scapy
sniff
函数时,过了一会儿你会看到 scapy.libs.winpcapy,第 36 行:
_lib_name = find_library("pcap")
find_library
位于 ctypes.util 中,对于 POSIX,它从第 72 行开始。在第 73 行,您可以看到该库预计为这些文件名之一 ['libpcap.dylib', 'pcap.dylib', 'pcap.framework/pcap']
,被馈送到 dyld_find。
dyld_find
位于第 121 行的 ctypes.macholib.dyld 中。如果您自己遍历第 125 行上的链,您会发现 dyld_find 正在尝试通过以下路径之一取得成功:
/usr/local/lib/
/Users/<user>/lib/
/usr/local/lib/
/lib/
/usr/lib/
在我的例子中,它们都不包含 libpcap 库,它由brew 安装在不同的位置。 图书馆位于
/usr/local/opt/libpcap/lib/
。
在这里,您只需将文件 libpcap.dylib
(libpcap.a
也没有问题)放入 dyld_find 搜索的路径之一。上面的两个软链接是更多可能的解决方案之一。
Scapy 使用
ctypes
与共享库进行通信,更具体地说,它使用 find_library()
函数(查找共享库)。该警告可能是由于 ctypes.util.find_library()
无法找到 libpcap.dylib
(或 Linux 中的 libpcap.so
)。为了确认,以下应返回 None
而不是库名称:
>>> from ctypes.util import find_library
>>> find_library("pcap")
在 MacOS 上,这是因为您的库不在默认路径中(请参阅https://docs.python.org/3/library/ctypes.html)