tcpdump是Linux下最常用的抓包工具了。不过往往抓着抓着就忘了时间,导致整个dump文件有几GB大,根本无法用软件分析。当然可以用工具分割dump文件,不过那又要耗一番功付。
tcpdump自带的-C参数是可以抓到一定数据包后停止抓包,不过怎么用怎么不顺手,于是自己写了个抓包脚本。Shell用的不熟,只能写个最简单的。 原理是外面套一个循环,利用自带的-C参数,将一定数量数据包存成一个文件,然后给加个后缀_0 _1 ...
看代码:
# !/bin/bash export TcpDump = tcpdumpexport SliPackeLen = 68 export SliptCapPacket = 500000 if [ $# -ne 2 ] && [ $# -ne 3 ] then echo " Usage: $0 <file> <CapCount> <expression> " else for ((iLoop = 0 ; iLoop< $2 ; iLoop ++ )) do echo "" echo " > Capture $1_$iLoop.dmp($SliptCapFile) in $(($iLoop+1))/$2 files " echo " $TcpDump -i eth1 -s $SliPackeLen -c $SliptCapPacket -w $1_$iLoop.dmp $3 " $TcpDump - i eth1 - s $SliPackeLen - c $SliptCapPacket - w $1_$iLoop .dmp $3 done fi echo ""export SliPackeLen=68 定义只抓数据包头的68字节 export SliptCapPacket=500000 满50W数据包就新建一个文件
给脚本个名字叫 z-dump_68_50w.sh,以后就可以用:./z-dump_68_50w.sh test 3 "host 192.168.0.12 and not udp"
来抓包了。蓝色的参数1是文件名,3是只生成3个分割后文件,这样抓到的就会以 test_0.dmp test_1.dmp test_2.dmp 存起来;另外需要注意的是过滤的参数部分,要用引号扩起来。
另外几个不同用途的脚本:
抓HTTP的 #!/bin/bash export TcpDump=tcpdump export SliPackeLen=65535 export SliptCapPacket=100000if [ $# -ne 2 ] && [ $# -ne 3 ]then echo "Usage: $0 <file> <CapCount x32MB> <expression>"else for ((iLoop=0; iLoop<$2; iLoop++)) do echo "" echo "> Capture $1_$iLoop.dmp($SliptCapFile) in $(($iLoop+1))/$2 files" echo "$TcpDump -i eth1 -s $SliPackeLen -c $SliptCapPacket -w WEB_$1_$iLoop.dmp port 80 and $3" $TcpDump -i eth1 -s $SliPackeLen -c $SliptCapPacket -w WEB_$1_$iLoop.dmp port 80 and $3 done fi echo ""DNS的 #!/bin/bash export TcpDump=tcpdump export SliPackeLen=58 export SliptCapPacket=1000000if [ $# -ne 2 ] && [ $# -ne 3 ]then echo "Usage: $0 <file> <CapCount x100w pkg> <expression>"else for ((iLoop=0; iLoop<$2; iLoop++)) do echo "" echo "> Capture $1_$iLoop.dmp($SliptCapFile) in $(($iLoop+1))/$2 files" echo "$TcpDump -i eth1 -s $SliPackeLen -c $SliptCapPacket -w dns_$1_$iLoop.dmp udp port 53 and $3" $TcpDump -i eth1 -s $SliPackeLen -c $SliptCapPacket -w dns_$1_$iLoop.dmp udp port 53 and $3 done fi echo ""
最后是个整理dump文件的脚本。每次抓到大量的文件,总不能就这么放在目录下吧,需要复制到另一个地方保存。不想每次都输一串命令,于是偷了点懒:
# !/bin/bash # ls -l | grep dmp du -sh * .dmpecho "" echo " move *.dmp -> D: (/mnt/WinD/dump/) " mv -i * .dmp /mnt/WinD/dump/ echo " OK. " echo " ----------------------- " df -hl | grep WinDdu -sh /mnt/WinD/dump/注意修改目录 /mnt/WinD/dump/,我是将Windows分区挂在了/mnt/WinD/,需要改成你自己的。后面的几个命令是显示该分区的大小以及dump文件夹下文件占用的大小。
点这里下载文章相关脚本: tcpdump-sh.rar
转载于:https://www.cnblogs.com/bits/archive/2009/03/03/Linux_tcpdump.html
相关资源:各显卡算力对照表!