我在 Android 平板電腦上安裝了 tcpdump,並從根 adb shell 執行命令。我的工作時間是從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
傳遞三個參數:
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 電腦上的引號(因為您鍵入命令的電腦上的 shell 刪除了引號)。
你也許可以做
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)'
我先打開shell,然後執行tcpdump:
adb shell
tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'