7

問題の説明:

tcpdump[1]から送信元アドレスと宛先アドレスのみを出力したい。

実用的な解決策が1つありますが、それは大幅に改善される可能性があると考えています。私が探しているものの例として、5つのパケットをキャプチャする例:

tcpdump -i eth1 -n -c 5 ip | \
cut -d" " -f3,5 | \
sed -e 's/^\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\)\..* \([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\).*$/\1 > \2/'

質問:

これはもっと簡単な方法で行うことができますか?ここではパフォーマンスも問題になります。

[1] snort home_netが正しく定義されているかどうか、またはhome_netでトラフィックが定義されていないことが確認されたかどうかのテストの一部。


解決:

わかりました、これに返信してくれたすべての人に感謝します。回答に関連する2つの懸念がありました。1つは異なるLinuxバージョン間の互換性であり、もう1つは速度です。

これが私が行った速度テストの結果です。最初にgrepバージョン:

time tcpdump -l -r test.dmp -n ip 2>/dev/null | grep -P -o '([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*? > ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)' | grep -P -o '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | xargs -n 2 echo >/dev/null

real    0m5.625s
user    0m0.513s
sys     0m4.305s

次に、sedバージョン:

time tcpdump -n -r test.dmp ip | sed -une 's/^.* \(\([0-9]\{1,3\}\.\?\)\{4\}\)\..* \(\([0-9]\{1,3\}\.\?\)\{4\}\)\..*$/\1 > \3/p' >/dev/null
reading from file test.dmp, link-type EN10MB (Ethernet)

real    0m0.491s
user    0m0.496s
sys     0m0.020s

そして最速のもの、awk-version:

time tcpdump -l -r test.dmp -n ip | awk '{ print gensub(/(.*)\..*/,"\\1","g",$3), $4, gensub(/(.*)\..*/,"\\1","g",$5) }' >/dev/null
reading from file test.dmp, link-type EN10MB (Ethernet)

real    0m0.093s
user    0m0.111s
sys     0m0.013s

残念ながら、それらの互換性をテストすることはできませんでしたが、gensub関数のためにawkが機能するにはgnuawkが必要です。とにかく、3つのソリューションはすべて、私がテストした2つのプラットフォームで機能します。:)

4

4 に答える 4

9

使用する1つの方法は次のGNU awkとおりです。

tcpdump -i eth1 -n -c 5 ip | awk '{ print gensub(/(.*)\..*/,"\\1","g",$3), $4, gensub(/(.*)\..*/,"\\1","g",$5) }'
于 2012-11-21T12:51:07.820 に答える
2

これを試して:

 tcpdump -i eth1 -n -c 5 ip 2>/dev/null | sed -r 's/.* ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).* > ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*/\1 > \2/'

.shスクリプトから実行する場合は、必要に応じて\1と\2をエスケープすることを忘れないでください。

于 2012-11-21T12:36:27.870 に答える
1

警告。のような別のコマンドの出力を監視するには、バッファなしのou行バッファ出力を使用する必要がありますtcpdump

しかし、あなたの命令は正しいようです。

簡単にするために、次のことができます。

tcpdump -i eth1 -n -c 5 ip | 
  sed -une 's/^.* \(\([0-9]\{1,3\}\.\?\)\{4\}\)\..* \(\([0-9]\{1,3\}\.\?\)\{4\}\)\..*$/\1 > \3/p'

u-c 5tcpdumpを使用せずにスイッチが便利であることに注意してください

tcpdump -ni eth1 ip | 
  sed -une 's/^.* \(\([0-9]\{1,3\}\.\?\)\{4\}\)\..* \(\([0-9]\{1,3\}\.\?\)\{4\}\)\..*$/\1 > \3/p'
于 2012-11-21T13:51:22.907 に答える
1

&ここにgrepのみのソリューションがあります:

tcpdump -l -i eth1 -n -c 5 ip 2>/dev/null | grep -P -o '([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*? > ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)' | grep -P -o '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | xargs -n 2 echo

-lを使用してパケット数を制限したくない場合は、注意してください-c

于 2012-11-21T13:59:07.797 に答える