問題の説明:
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つのプラットフォームで機能します。:)