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