2016-06-19 11 views
0

パケットがポートeth1に到着するたびに、そのパケットサイズを抽出して、これをパラメータとしてスクリプトcap.shに渡します。パケットサイズを抽出し、パラメータとしてスクリプトに渡す

は私のアプローチ:

は、私はそれが

1466352405.455975 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 46) 
192.168.52.53.32769 > 192.168.52.54.9600: UDP, length 18 

私は長さ(46)を抽出したいを提供

tcpdump -nttv -i eth1を試してみましたが、私のスクリプトcap.shにこれを渡し

sh cap.sh 46 

これを実装する方法を知りたいですか?

答えて

1

tcpdumpの出力形式に頼って、grep -Po '(?<=length)\d+(?=\))'のようなものでパケット長を抽出することができます。

ここでgrep-PスイッチはPerl正規表現をオンにします。-oはgrepに一致する部分だけを出力します。そうすれば、正規表現の(?<=length)の部分が見た目が暗いので、一致する前にlength[space]にする必要があります。 \d+は1桁以上の数字に貪欲に一致し、(?=\))部分は先読みします。したがって、中括弧は一致の後になければなりません。 LookaheadsとLookbehindsはそれ自身では一致しません。それらをアンカーとみなしてください。あなたは、$を終了行アンカーを追加することにより、正規表現をより厳密に行うことができます

注:(?<=length)\d+(?=\)$)

あなたのアプローチは、ポータブルかつ普遍的にしたい場合、私は本当にこれをやってお勧めしません。

あなたは、パイプのバッファがそれをフラッシュする一杯になるまで待つ必要はありませんので、だから、全部が

while read lngth ; do sh cap.sh "$lngth" ; done< <(unbuffer tcpdump -i eth1 -nttv 2>/dev/null | unbuffer -p grep -Po '(?<=length)\d+(?=\))') 

ようになりexpectから、それはunbufferを使用していますのでご注意ください。

長さを抽出する別のアプローチは、scapy、Python用のパケット検査/操作モジュール(https://github.com/secdev/scapyhttps://github.com/phaethon/scapy)のようなものを使用することです。 scapyを使用して無限ループにIPパケットの長さを出力 Pythonスクリプトは次のようになります。

from scapy.all import * 
sniff(filter='ip', prn=lambda x: x.sprintf("%IP.len%")) 

ですから、このスクリプトでtcpdump | grep一部を置き換えることができ、または多分Pythonであなたのcap.shを書き換えてみませんかPythonのすべてのこと。

+0

ありがとう、私はtcpdumpでgrepを試しましたが、パケット長を抽出しませんでした。 – user2532296

+0

答えを編集しました。正規表現についての優れた情報源として[this](http://www.regular-expressions.info)リソースをチェックアウトすることをお勧めします。 –

+0

情報ありがとうございます。私はここ(https://regex101.com/)で試しましたが、それでも動作しません。 – user2532296

関連する問題