我正在尝试从.pcap文件中获取数据包的随机子集。为此,我编写了以下shell脚本:
large_number=150000
smaller_number=10000
selected_packet_numbers=$(shuf -i 0-"$large_number" -n "$smaller_number")
editcap -r capture.pcap capture-selected.pcap $selected_packet_numbers但是,editcap给了我以下错误:
Out of room for packet selections使用shell循环将花费不合理的长时间。
如何从.pcap文件中选择数据包的随机子集?
发布于 2017-11-03 09:41:04
目前,您需要减少smaller_number,使其值严格小于512。如果您想要更多的包选择,您可能必须在editcap.c源代码中更改MAX_SELECTIONS的值,并自己编译它。
发布于 2017-11-04 20:44:46
正如Christopher Maynard所解释的,使用editcap一次最多只能选择512个数据包。This thread on Wireshark mailing list提供了更多信息。
如果您不想更改editcap的源代码,您可以批量选择数据包。下面的脚本生成10000个随机数,然后分批选择512个数据包。最后,将生成的.pcap文件合并到单个.pcap文件中。
#!/bin/bash
large_number=150000
smaller_number=10000
selected_pkt_numbers=$(shuf -i 0-"$large_number" -n "$smaller_number")
for j in `seq 0 512 $smaller_number`; do
endrange=$((j+512))
if [ "$endrange" -gt "$smaller_number" ]; then
endrange=$smaller_number
fi
# Selects numbers $j to $endrange from the generated random numbers:
echo "$j - $endrange"
pkt_numbers=$(echo $selected_pkt_numbers | awk -v start="$j" -v end="$endrange" '{ out=""; for (i=start+1; i<=end; i++) out=out" "$i; print out}')
editcap -r $1 $2-$j.pcap $pkt_numbers
done
mergecap -w $2.pcap `ls $2-*.pcap`要使用它:
$ ./pcap-random.sh input-file.pcap output-file
0 - 512
512 - 1024
[...]
9216 - 9728
9728 - 10000
$
$
$ capinfos output-file.pcap
File name: output-file.pcap
File type: Wireshark/... - pcapng
File encapsulation: Ethernet
File timestamp precision: microseconds (6)
Packet size limit: file hdr: (not set)
Packet size limit: inferred: 58 bytes
Number of packets: 10 k
[...]与修改editcap的源代码相比,该脚本的执行时间会更长。我还没有量过多少。使用您给出的参数,它需要大约11秒才能执行。
https://stackoverflow.com/questions/47067272
复制相似问题