tcpdump 過濾器表達式透過 adb 中斷

tcpdump 過濾器表達式透過 adb 中斷

我在 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傳遞三個參數:

  1. shell
  2. tcpdump
  3. 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命令將被傳遞

  1. shell
  2. tcpdump
  3. '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)'

相關內容