WiresharkでUSBパケットを解析するときのニッチな要求に応えたときのメモ(その2)
WiresharkでUSBパケットを解析するときのニッチな要求に応える の手順はWiresharkで色々操作しないといけないのがめんどっちいので、スクリプトで自動化してみた。
WiresharkのCUI版である、tsharkを使うと出来るらしいとの情報があったので、試してみたときのメモ。
今回はRaspberryPiだけ。Windowsは対応してません。
WiresharkでUSBパケットをキャプチャするときの注意事項 の準備は出来ているものとする。(Wiresharkは入ってなくても大丈夫。もちろん 入ってても良いよ。)
tsharkは以下のコマンドイッパツでインストール。
sudo apt install tshark
で、あとは以下のスクリプトを
WiresharkでUSBパケットを解析するときのニッチな要求に応える
のjson_read.py
と同じディレクトリに作成し、実行するだけ。
cap.sh
#!/usr/bin/env bash
# 第一引数でキャプチャ期間(sec)
if [ -z "$1" ]; then
# 引数なしだと2secに設定
period=2
else
# 引数のチェック
if expr "$1" : '[0-9]*' > /dev/null ; then
# 数値
if [ $1 -lt 1 ] ; then
# 1未満の数値
echo "1以上の数字を指定してください"
exit
else
# 1以上の数値(OK)
period=${1}
fi
else
# 数値でない
echo "1以上の数字を指定してください"
exit
fi
fi
# 現在時刻
cur_time=`date "+%y%m%d_%H%M%S"`
# ファイル名生成
fname_base=${cur_time}_${period}
# USBパケットキャプチャ
echo "Capture USB packets for ${period} second from ${cur_time}"
tshark -i usbmon1 -w ${fname_base}.pcapng -a duration:${period}
# バス番号、デバイス番号の抽出
tmp_str=`lsusb | grep WebCam`
bus_and_dev=(`echo ${tmp_str} | sed -e "s/Bus \(.*\)Device \(.*\): ID.*/\1 \2/g"`)
bus=`echo ${bus_and_dev[0]} | sed 's/0*\([0-9]*[0-9]$\)/\1/g'`
dev=`echo ${bus_and_dev[1]} | sed 's/0*\([0-9]*[0-9]$\)/\1/g'`
endpoint=1
addr=${bus}.${dev}.${endpoint}
# echo ${addr}
# JSONファイルをエクスポート
echo JSON data save to ${fname_base}.json...
tshark -r ${fname_base}.pcapng -Y "usb.src==\"${addr}\"" -T json > ${fname_base}.json
# JSON->CSV 変換
python json_read.py ${fname_base}.json ${fname_base}.csv
以下のコマンドで実行する。キャプチャ時間を秒で設定する。省略時は2秒。
出力されるファイル名は実行時の時刻で作成された文字列に各拡張子を付加したもの。
bash cap.sh [キャプチャ時間(sec)]
なんかパラメータチェックが一番長いなぁ…😅
33行目でパケットキャプチャ実行。
35~41行目で対象USB機器のアドレス(バス番号、デバイス番号)を取得している。
36行目のgrep
のパラメータは対象となるUSB機器に合わせて変更してちょ。
エンドポイント番号は対象機器によって固定なので、調べてね。
分からなかったら、キャプチャしたデータをWiresharkで読み込んで確認してちょ。
46行目でキャプチャしたファイルをJSONファイルにエクスポート。
49行目でJSON→CSV変換。
これでWiresharkでUSBパケットを解析するときのニッチな要求に応える
の手順をスクリプトイッパツで完了できる。
ま、特定環境でしか試してないから、どんな環境でも使えるとは限らないけど…