Androidタブレットにtcpdumpをインストールし、ルートadbシェルからコマンドを実行しています。tcpdump マニュアルページの例具体的にはこれです:
ポート 80 との間で送受信されるすべての IPv4 HTTP パケットを印刷します。つまり、SYN パケットや FIN パケット、ACK のみのパケットなどではなく、データを含むパケットのみを印刷します。
tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
上記のコマンドをデスクトップ (Ubuntu) で実行すると、正常に動作します。Android デバイスで実行してみると、次のようになります。
adb shell tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
次のエラーが発生します:
/system/bin/sh: can't create 2)) != 0): Read-only file system
/system/bin/sh: here document missing
tcpdump: syntax error
次のコマンドは Android デバイスで正常に実行されます。
tcpdump 'tcp port 80'
フィルター式が適切に解析されていないか何かのようですが、正直に言うと、それがどのように機能するかはよくわからないので、トラブルシューティングをどこから始めればよいかわかりません。何が問題なのか、またはどのように修正すればよいのか、何かアイデアはありますか?
答え1
引用符により、コマンドadb
に 3 つの引数が渡されます。
shell
tcpdump
tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)
おそらくその後、コマンドを実行しようとするだろう
tcpdump tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)
それなしAndroid マシンでは、引用符は削除されます (コマンドを入力したマシンのシェルによって引用符が削除されるため)。
おそらくできる
adb shell tcpdump "'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'"
つまり、adb
コマンドは渡される
shell
tcpdump
'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
コマンドを実行しようとする
tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
Android マシン上で。
同じ問題は、例えば、ssh
コマンド
ssh localhost tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
エラーを取得する
bash: -c: line 0: syntax error near unexpected token `('
bash: -c: line 0: `tcpdump tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
答え2
コマンドが正確にどこで解釈されなかったのかはまだわかりませんが、次のようにすれば問題はなくなります。
adb shell tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
まずシェルを開いて、tcpdump を実行します。
adb shell
tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'