2014-03-13 69 views
0

我想從一個shell腳本中的tcpdump中獲取一些數字並打印該數字。在bash腳本里面運行tcpdump

這裏是我的腳本

while true 
do 
{ 
b=`tcpdump -n -i eth1 | awk -F'[, ]' '{print $10}'` 
echo $b 
} 
done 

當我執行這個腳本,我得到這個

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode 
listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes 

有什麼特別的,我需要做捕捉shell腳本里面tcpdump的O/P?

回答

2

默認情況下,tcpdump將永遠運行(或直到它被Control-C或類似物打斷)。該

b=`tcpdump ...` 

結構運行,直到tcpdump出口......這是從來沒有......和然後把它的輸出到$ B。如果要捕獲單個數據包的輸出,可以使用tcpdump -c1 ...(或-c5捕獲5個或類似的組)。或者,你可以讓它永遠運行,但在與while read循環時間捕捉它的輸出一行(雖然你需要使用tcpdump -l,以防止過多的緩衝):

tcpdump -l -n -i eth1 | awk -F'[, ]' '{print $10}' | while read b; do 
    echo $b 
done 

我並不完全相信你的腳本應該這樣做,但我看到一些其他問題。首先,除非你的版本tcpdump比我的版本更加一致,否則打印每個數據包的第10個逗號分隔的字段將而不是給你任何有意義的東西。下面是從我的電腦的一些示例輸出:

00:05:02:ac:54:1e 
1282820004:1282820094 
90 
73487384:73487474 
1187212630:1187212720 
90 
90 
host 


2120673524 

二,什麼是捕捉輸出到一個變量,然後打印的點?爲什麼不直接運行命令並直接輸出呢?最後,echo $b由於分詞和通配符擴展(例如,如果$ b碰巧是「*」,它會打印當前目錄中的文件列表),可能會輸出輸出。出於這個原因,當你使用變量時你應該使用雙引號(在這種情況下,echo "$b")。

+0

詳細說明,我試圖捕獲或打印每當確認數大於特定值。例如,如果我這樣做,tcpdump -n -i eth1'(tcp [tcpflags] == tcp-ack)'| awk -F'[,]''{print $ 10}',它只顯示確認號碼。我真正想做的是查找我的ack號碼是否等於1024,並打印一條消息,例如找到ack號碼。這是我的目標,並不確定我如何在live tcpdump流程中實現這一目標。 – user238021

+1

啊,如果你這樣限制,你更有可能得到一致的結果。在那種情況下,我會認爲'while read'循環是最好的方法。 –

+0

謝謝戈登。我正在嘗試這樣的事情。基本上,打印19000到20000之間的數字。tcpdump -n -i eth1'(tcp [tcpflags] == tcp-ack)和(src host 192.168.2.1)'| awk -F'[,]''{print $ 10}'|同時閱讀b;做echo $ b | awk'{if($ 1> 19000 && $ 1 <20000)print $ 1}';完成 – user238021