我编写了一个脚本,用于嗅探来自主机的数据包,但是,我正在以连续模式嗅探数据包,并希望在超时时停止嗅探。我编写了以下代码来停止数据包嗅探,但是当时间明显超过超时时间时,它似乎并没有停止。我在这里可能做错了什么?
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)
然后我们获得此输出,每秒捕获成千上万个 additional 数据包,超过捕获应该停止的时间:
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在超时后仍继续捕获数据包?
答案 0 :(得分:1)
我遇到了同样的问题,我设法找到了解决方案。它不是完美的,但是它通过告诉捕获循环在下一个数据包上停止并发送一个空数据包来使其结束而起作用。我将它放在高端口的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自己还比较陌生,但是我认为在这种情况下,这应该是一个可以接受的解决方案
答案 1 :(得分:0)
您似乎遇到了{y {3}},但多年来一直未解决。根据主题,作者写道
您可以继承LiveCapture的子类并覆盖get_parameters()函数,添加自己的参数。
您可以修改发送给tshark的参数,但是,为什么不直接使用tshark命令呢?
PyShark只是系统上tshark的包装。如果要在Python中使用known issue,则等效的tshark命令为tshark -a duration:5
。直接使用tshark的另一个优点是子进程为您提供了一个pid,您可以在任意条件下将其杀死。
有关更多详细信息,请参见subprocess。