gpt4 book ai didi

linux - 需要一个 awk/sed/cut 替代方案来解决 tcpdump 输出上看起来很简单的问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:28:02 24 4
gpt4 key购买 nike

这是我的问题输入文件,它包含不同类型的 n/w 数据包以及 header 信息。

这是一个仅包含两个数据包的示例文件......

18:10:17.528660 IP6 2001::100 > 2001::200: ESP(spi=0x00005fb4,seq=0x23),
length 168
0x0000: 6000 0000 00A8 3220 2001 0000 0000 0000 ................
0x0010: 0000 0000 0000 0100 2001 0000 0000 0000 ................
0x0020: 0000 0000 0000 0200 0000 5FB4 0000 0023 ................
0x0030: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0040: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0050: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0060: 5361 6C74 6564 5F5F 1267 6EE1 8FFD A625 ................
0x0070: 6DAB 0F22 B006 0809 505F CD62 4C4F FCC2 ................
0x0080: 0966 DD9A E1E8 F582 EF63 C8BF 5F08 3D46 ................
0x0090: 3033 3361 3666 6131 3430 3036 6163 3931 ................
0x00a0: 3365 6137 3936 3866 6133 6334 6434 3837 ................
0x00b0: 3037 6531 6534 3761 0A00 0000 0000 0000 ................
0x00c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
18:10:17.528660 IP6 2001::100 > 2001::200: ESP(spi=0x00005fb4,seq=0x23),
length 168
0x0000: 6000 0000 0070 3220 0000 0000 0000 0000 ................
0x0040: 0000 0000 0000 0001 0000 0000 0000 0000 ................
0x0050: 0000 0000 0000 0002 0000 0270 0000 000D ................
0x0060: 5361 6C74 6564 5F5F 682A CB8F 97D9 10A2 ................
0x0070: 1D12 88CB EE21 9F00 42AF AFA4 C919 B1E6 ................
0x0080: 045A B5DF 93BE FA50 3231 3164 3939 6534 ................
0x0090: 3332 6563 3634 3737 6133 6265 3231 6161 ................
0x00a0: 3730 3866 6331 3636 3363 3933 6232 3264 ................
0x00b0: 0A00 0000 0000 0000 0000 0000 0000 0000 ................
0x00c0: 0000 0000 0000 0000 ........

这些 ... 可以是任何它们各自对应于指定的十六进制字符的 ascii 字符。我只需要提取每个数据包的中间十六进制部分。

我需要以下格式的输出。

6000 0000 00A8 3220 2001 0000 0000 0000
0000 0000 0000 0100 2001 0000 0000 0000
0000 0000 0000 0200 0000 5FB4 0000 0023
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
5361 6C74 6564 5F5F 1267 6EE1 8FFD A625
6DAB 0F22 B006 0809 505F CD62 4C4F FCC2
0966 DD9A E1E8 F582 EF63 C8BF 5F08 3D46
3033 3361 3666 6131 3430 3036 6163 3931
3365 6137 3936 3866 6133 6334 6434 3837
3037 6531 6534 3761 0A00 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000

例如,此处应生成两个文件,即 ipsec_packet1.txt 和 ipsec_packet2.txt,每个文件应仅由上述格式指定的中间十六进制部分组成。

这是我的脚本..

 cat received_ipsec.txt | tr '[a-z]' '[A-Z]' > tmp_tcpdump.txt

count=`grep -w -c 0X0000 tmp_tcpdump.txt`

grep -w -n 0X0000 tmp_tcpdump.txt > tmp_samp.txt

i=1

cut -d ":" -f$i tmp_samp.txt | tr '\n' ' ' > tmp_try.txt

while [ $i -le $count ]

do

k=`expr $i + 1 `

prev_j=`cut -d " " -f$i tmp_try.txt`
next_j=`cut -d " " -f$k tmp_try.txt`

//这部分需要注意......

    if [ $i -eq $count ]
then

awk -v prev_j=$prev_j '{if(NR>=prev_j)print $0}'
tmp_tcpdump.txt > tmp_packet.txt


// first trial failed so commented

# cut -d ":" -f2 tmp_packet.txt | sed 's/ *//' |
# cut -d " " -f1-8 > ipsec_packet$i.txt

// secone trial failde so commented

# cut -d " " -f 3-10 tmp_packet.txt > ipsec_packet$i.txt

// third one although it also not working properly but will
explain it below


cut -d ":" -f2 tmp_packet.txt | awk -F " "
'{printf "%s %s %s %s %s %s %s %s \n",
$1,$2,$3,$4,$5,$6,$7,$8}' >ipsec_packet$i.txt

else
awk -v prev_j=$prev_j -v next_j=$next_j
'{if(NR>=prev_j && NR<next_j-1)print $0}' tmp_tcpdump.txt
> tmp_packet.txt

# cut -d ":" -f2 tmp_packet.txt | sed 's/ *//' |
# cut -d " " -f1-8 > ipsec_packet$i.txt

# cut -d " " -f 3-10 tmp_packet.txt > ipsec_packet$i.txt


cut -d ":" -f2 tmp_packet.txt | awk -F " "
'{printf "%s %s %s %s %s %s %s %s \n",
$1,$2,$3,$4,$5,$6,$7,$8}' > ipsec_packet$i.txt

fi

i=`expr $i + 1 `

done

现在创建部分的问题是...

   cut -d ":" -f2 tmp_packet.txt | awk -F " " 
'{printf "%s %s %s %s %s %s %s %s \n",
$1,$2,$3,$4,$5,$6,$7,$8}'

如果最后一行是这样的,那么就没有问题(如上面的数据包 1 所示)

   0000 0000 0000 0000 0000 0000 0000 0000 

但如果最后一行是这样的,那么就有问题了(如上面的数据包 2)

   0000 0000 0000 0000 

然后它将从虚线部分获取其他四个字段,如..

   0000 0000 0000 0000 ....

可能我不需要所有这些来执行我的任务,但我是新手所以对这个 sed/awk 世界了解不多。

编辑:

这是 grep 样本之一的输出...我不知道为什么它是这种格式。这就是为什么我没有使用简单的 cut by column 逻辑

2:      0X0000:  6000 0000 00A8 3220 2001 0000 0000 0000  
16: 0X0000: 6000 0000 0070 3220 0000 0000 0000 0000
27: 0X0000: 6000 0000 0080 3220 0000 0000 0000 0000

最佳答案

在你只 grep 相关行之后,就这样做

cut -d: -f2- | cut -c3-42

可能会出现差一错误,但您可以通过反复试验来修复这些错误。或者,您可以仅通过一个单独的 cut -c... 来完成,但您需要计算更多字符。

关于linux - 需要一个 awk/sed/cut 替代方案来解决 tcpdump 输出上看起来很简单的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8295843/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com