需求描述: shell
請經過tcpdump命令進行抓包,抓192.168.0.100的IP的3022端口的全部包; windows
並要求每10分鐘開啓一個新的抓包進程,新進程開啓後,再關閉原有進程(目的是防止抓包信息量過大不容易分析); tcp
同時對/jboss/server/default/log目錄下的xxx.log日誌進行監控,當日志中出現「Connection connected to :192.168.0.100:3022」後中止抓包,最後只需保留最後一個抓包文件,刪除多餘的方便分析。 工具
實現思路: spa
1)編寫collect_data腳本,使用正確的tcpdump命令按照要求抓包
/usr/sbin/tcpdump -i eth0 -n dst host 192.168.0.100 and dst port 3022 -vv -w file 日誌
說明:-w file 指把tcpdump的內容保存到一個二進制文件中,該文件使用 tcpdump -r file 來讀取,每次執行這個命令都會重寫file文件至關於>符號。 server
2)每10分鐘開啓一個新抓包進程目的是爲了防止抓包信息持續寫進一個文件中,致使文件過大不容易分析,因此shell程序必須可以進行新舊抓包命令的更替(每次更替分別將輸出重定向到不一樣的文件日誌中防止文件過大)。每10分鐘進行一次,能夠利用cron來定時,定時執行collect_data腳本,腳本中每次執行都完成開啓新tcpdump進程,確保新tcpdump進程開啓後再kill掉以前的進程的動做就能夠了。而實現這一點,須要每次執行後記錄本次執行的pid,下一次執行新的進程時再記錄新的pid而後kill掉上次的pid,這樣就知足了需求。
3)單獨編寫一個shell程序,用來實時的監視xxx.log日誌,當日志中出現關鍵字後就kill掉tcpdump進程,保留本次tcpdump的輸出的日誌,刪除上一次tcpdump進程的輸出的日誌,最後處理cron定時,再也不執行定時不然會沖掉分析記錄。 進程
# vi collect_data 用來作tcpdump新舊進程交替的動做 ci
#!/bin/sh #author:shenxiaoran #date:2013-3-12 prog_home=/home/shenxiaoran prog=/usr/sbin/tcpdump test -f $prog_home/flag || touch $prog_home/flag cat $prog_home/flag if [ $(cat $prog_home/flag) -eq 0 ];then $prog -i eth0 -n -nn dst host 192.168.0.100 and dst port 3022 -vv -w $prog_home/a.log & 2>/dev/null echo $! > $prog_home/tcpdump.0.run if [ $? -eq 0 ];then # ps -ef|grep tcpdump|grep -v root|awk '{print $2}'|head -1 > $prog_home/tcpdump.0.run # echo "ps : `ps -ef|grep tcpdump|grep -v root|awk '{print $2}'|head -1`" # echo "tcpdump.0.run: `cat $prog_home/tcpdump.0.run`" sleep 1 test -e $prog_home/tcpdump.1.run && cat $prog_home/tcpdump.1.run|xargs kill -9 > /dev/null fi echo 1 > $prog_home/flag exit fi if [ $(cat $prog_home/flag) -eq 1 ];then $prog -i eth0 -n -nn dst host 192.168.0.100 and dst port 3022 -vv -w $prog_home/b.log & 2>/dev/null echo $! > $prog_home/tcpdump.1.run if [ $? -eq 0 ];then # ps -ef|grep tcpdump|grep -v root|awk '{print $2}'|head -1 > $prog_home/tcpdump.1.run # echo "ps : `ps -ef|grep tcpdump|grep -v root|awk '{print $2}'|head -1`" # echo "tcpdump.1.run: `cat $prog_home/tcpdump.1.run`" sleep 1 test -e $prog_home/tcpdump.0.run && cat $prog_home/tcpdump.0.run|xargs kill -9 > /dev/null fi echo 0 > $prog_home/flag exit fi |
#!/bin/sh #author:shenxiaoran prog_home=/home/shenxiaoran log_file=/var/mqm/qmgrs/QM\!HL1/errors/xxx.log while : do tail $log_file |grep "Channel 'TO.QM.CENTER2' is starting" if [ $? -eq 0 ];then echo "Successful matches" current_tcpdump_pid=$(ps -ef|grep tcpdump|grep -v root|awk '{print $2}'|head -1) if [ -z "$current_tcpdump_pid" ];then echo "No any tcpdump process,$0 exit" break elif [ $current_tcpdump_pid -eq `cat $prog_home/tcpdump.0.run` ];then echo "kill prog" rm -f $prog_home/b.log cat $prog_home/tcpdump.0.run|xargs kill -9 > /dev/null sed -i -e 's/[0-9][0-9] [0-9][0-9] \* \* \* \/home\/shenxiaoran\/collect_data.*/#&/' /var/spool/cron/root /etc/init.d/crond reload elif [ $current_tcpdump_pid -eq `cat $prog_home/tcpdump.1.run` ];then echo "kill prog" rm -f $prog_home/a.log cat $prog_home/tcpdump.1.run|xargs kill -9 > /dev/null sed -i -e 's/[0-9][0-9] [0-9][0-9] \* \* \* \/home\/shenxiaoran\/collect_data.*/#&/' /var/spool/cron/root /etc/init.d/crond reload fi # pkill tcpdump > /dev/null break fi # sleep 60 done |
大功告成,這是本人運行過程當中遇到的一個實際的需求案例,寫在這裏供你們參考。 it
注:使用tcpdump抓包而後放到windows桌面利用wireshark圖形工具分析的時候,常常提示下圖出現的錯誤,如何解決?
這個問題主要是因爲tcpdump命令的參數使用不當形成的,注意使用-s 0 參數,保存文件時也不要用重定向而是使用-w file參數,保存的文件名最好直接使用xxx.pcap後綴,這樣wireshark工具直接認識。
-s 0 : 抓取數據包時默認抓取長度爲68字節。加上-s 0 後能夠抓到完整的數據包。若存在雙網卡的狀況,須要明確制定包從哪一個網卡進來,添加相似 -i eth1這樣的參數,不然默認監聽eth0網卡。
例如:tcpdump -nn -s 0 host 192.168.11.243 and port 80 -w wireshark.pcap