我正在使用scapy
和python
来嗅探实时流量。
capture=sniff(iface="<My Interface>", filter="tcp")
但这会嗅探每个数据包并将其添加到列表中,capture
以便稍后处理。
后立即显示数据包的几个字段,即在嗅探数据包时,它将触发一个函数,我可以在其中分析该数据包。这将持续几个数据包。
我已经准备好了与捕获的数据包列表一起使用的功能。但是我无法将其用于每个实时数据包。
如何实现?是否可以使用scapy
或我需要安装任何其他软件包?
嗅探函数的参数应类似于以下代码:
from scapy.all import *
def pkt_callback(pkt):
pkt.show() # debug statement
sniff(iface="<My Interface>", prn=pkt_callback, filter="tcp", store=0)
store=0
说不存储收到的任何数据包,prn
说将pkt
发送到pkt_callback
。
源。
正如 Yoel 所提到的,如果只需要一个操作,lambda
可以与 prn
一起使用,而不是像这种情况一样使用新功能:
sniff(iface="<My Interface>", prn = lambda x: x.show(), filter="tcp", store=0)
可以通过sniff
函数的prn
参数来完成。 Scapy
的教程在这里有一个简单的例子。 Scapy
的官方API文档指定:
sniff(prn=None, lfilter=None, count=0, store=1, offline=None, L2socket=None, timeout=None)
。
prn
:应用于每个数据包的功能。如果返回了某些内容,则会显示该内容。例如,您可以使用prn = lambda x: x.summary()
.
...
编辑:
接受的答案声称必须将store
参数设置为0
才能调用prn
回调。但是,设置store=0
没有任何此类效果。 Scapy
自己的例子没有设置store=0
,官方API文档也没有提到任何这样的要求。事实上,检查Scapy
的源代码会发现store
和prn
参数之间没有任何联系。以下是相关代码块的摘录:
...
if store:
lst.append(p)
c += 1
if prn:
r = prn(p)
if r is not None:
print r
...
执行一些简单的测试用例也支持这一发现。