我在嗅探数据包时遇到 scapy 超时选项的问题。据我了解,如果你使用这样的东西:
test = sniff(filter="ip and icmp ", timeout = 2)
print(test)
您的嗅探应该在 2 秒后超时。然而,这100%不起作用。根据我收集的信息,最大的问题之一是,如果您设置超时 = 5 并运行嗅探器,然后在并行命令提示符中运行 ping google.com,它将捕获 4 个数据包直到嗅探才显示完成,然后无限期地坐在那里,直到您再发送或接收 1 个 icmp 数据包,仅一个,然后它将终止嗅探并打印(测试),总共 5 个 icmp 4 来自第一个 ping 集,1 个来自第二个 ping。
我使用的是windows,这可能是我不知道的问题。我有Python 2.7。我的整个脚本,为了测试这一件事必须将其与更大的脚本隔离是这样的:
from scapy.all import *
test = sniff(filter="ip and icmp ", timeout = 5)
print(test)
就是这样 - 如果 timeout = 1,则在收到数据包之前它不会停止。
这是 scapy 的 sendrecv.py 中用于嗅探超时的代码
if timeout is not None:
stoptime = time.time()+timeout
remain = None
while 1:
try:
if timeout is not None:
remain = stoptime-time.time()
if remain <= 0:
break
从 scapy sendrecv.py 中剥离该函数并意识到该函数具有相同的问题后,我已经缩小了问题范围。当您将过滤器传递到嗅探函数时,它会改变超时的工作方式。如果你跑步:
来自 scapy.all 导入 *
test = sniff(timeout = 5)
print(test)
你会没事的,它会在 5 秒后自动超时,否则它会挂起并且无法正确完成超时循环。
我尝试过完全相同的代码,它对我来说非常有效。尝试重新安装 scapy,或恢复到旧版本。我发现对我来说 2.2.0dev 是更稳定的版本之一。