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/scapy、https://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のすべてのこと。
ありがとう、私はtcpdumpでgrepを試しましたが、パケット長を抽出しませんでした。 – user2532296
答えを編集しました。正規表現についての優れた情報源として[this](http://www.regular-expressions.info)リソースをチェックアウトすることをお勧めします。 –
情報ありがとうございます。私はここ(https://regex101.com/)で試しましたが、それでも動作しません。 – user2532296