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)'

相关内容