问题
我编写了一个从主机嗅探数据包的脚本,但是,我正在以连续模式嗅探数据包,并且希望在超时时停止嗅探。我编写了以下代码来停止数据包嗅探,但当时间明显超过超时时,它似乎并没有停止。我在这里可能做错了什么?
import time
import pyshark
prog_start = time.time()
capture = pyshark.LiveCapture(interface='en0')
capture.sniff(timeout=10)
start_time = capture[0].frame_info.time_epoch
end_time = capture[-1].frame_info.time_epoch
print("Capture lasted:", float(end_time) - float(start_time))
pkt_num = 0
for pkt in capture:
pkt_num += 1
print("Time", time.time() - prog_start, "Pkt#", pkt_num)
然后我们得到这个输出,每秒有数千个额外数据包,超过了捕获应该停止的时间:
Capture lasted: 9.148329019546509
Time 10.346031188964844 Pkt# 1
Time 10.348641157150269 Pkt# 2
Time 10.351708889007568 Pkt# 3
Time 10.353564977645874 Pkt# 4
Time 10.35555100440979 Pkt# 5
...
问题
为什么PyShark超时后还继续抓包?
最佳答案
我也遇到了同样的问题,我设法找到了解决方案。它并不完美,但它的工作原理是告诉捕获循环在下一个数据包上停止并发送一个空数据包,它将看到它结束。对于我的情况,我将其设置为高端口上的 udp 数据包,因为我使用过滤器过滤掉大部分流量,因此该解决方案对我有用
class PacketCapture(threading.Thread):
capture = 1
def __init__(self, interface_name):
threading.Thread.__init__(self)
self.interface_name = interface_name
def stop(self):
self.capture = 0
def run(self):
capture = pyshark.LiveCapture(interface=self.interface_name)
try:
for packet in capture.sniff_continuously():
if not self.capture:
capture.close()
except pyshark.capture.capture.TSharkCrashException:
self.exited = 1
print("Capture has crashed")
#start capture
pcap = PacketCapture(interface_name)
pcap.start()
#stop capture
pcap.stop()
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
msg = bytes("", "UTF-8")
sock.sendto(msg, ("external IP", 12345))
sock.close
我自己对 python 比较陌生,但我认为考虑到这种情况,这应该是一个可以接受的解决方案
关于packet - 我想在满足条件后停止数据包捕获,同时连续嗅探,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58300485/