如何使用 BPF 重新过滤 scapy 数据包?
How can I re-filter a scapy packet using BPF?
我正在编写一个需要重新过滤由 sniff() 捕获的数据包的程序。我想将 BPF 文件管理器应用于每个数据包,如果它匹配,return true,否则 return 错误。
谁能给我一些提示吗?谢谢!
作为记录,这是我在 issue you have opened:
上的回答
您不需要 BytesIO
对象,因为 sniff()
的 offline
参数可以接受 PacketList
或单个 Packet
。
你可以这样做:
pkts=sniff(count=10)
pkts_icmp = sniff(offline=pkts, filter='icmp')
数据通过其标准输入传递到 tcpdump
进程,因此它不会触及您的硬盘驱动器,除非您使用的是 MacOS X(但这是 tcpdump / MacOS X 的限制,Scapy不能在这里做得更好)。
如果你想对每个数据包进行测试,你可以这样做:
pkts = sniff(count=10)
for pkt in pkts:
if sniff(offline=pkt, filter='icmp'):
print 'match!'
请注意,这将为每个数据包分叉一个 tcpdump
进程,这可能并不理想。
附带说明一下,如果您的测试就这么简单,您也可以改用 Scapy 测试(尽管它并不完全等同,但在某些情况下会有所帮助,并且不会为每个已处理的数据包分叉一个进程) :
pkts = sniff(count=10)
for pkt in pkts:
if ICMP in pkt:
print 'match!'
我正在编写一个需要重新过滤由 sniff() 捕获的数据包的程序。我想将 BPF 文件管理器应用于每个数据包,如果它匹配,return true,否则 return 错误。
谁能给我一些提示吗?谢谢!
作为记录,这是我在 issue you have opened:
上的回答您不需要 BytesIO
对象,因为 sniff()
的 offline
参数可以接受 PacketList
或单个 Packet
。
你可以这样做:
pkts=sniff(count=10)
pkts_icmp = sniff(offline=pkts, filter='icmp')
数据通过其标准输入传递到 tcpdump
进程,因此它不会触及您的硬盘驱动器,除非您使用的是 MacOS X(但这是 tcpdump / MacOS X 的限制,Scapy不能在这里做得更好)。
如果你想对每个数据包进行测试,你可以这样做:
pkts = sniff(count=10)
for pkt in pkts:
if sniff(offline=pkt, filter='icmp'):
print 'match!'
请注意,这将为每个数据包分叉一个 tcpdump
进程,这可能并不理想。
附带说明一下,如果您的测试就这么简单,您也可以改用 Scapy 测试(尽管它并不完全等同,但在某些情况下会有所帮助,并且不会为每个已处理的数据包分叉一个进程) :
pkts = sniff(count=10)
for pkt in pkts:
if ICMP in pkt:
print 'match!'