adb shell ...
行为的某些方面表明,这是两个挂在该命令后面的外壳。这意味着将调用adb shell
序列的主机的一个shell,然后是目标系统shell。命令字符串似乎通过两个外壳的管道。
adb -s $AdbID shell echo find / -type f \( -name \*audio\* -or \
-name \*alsa\* \) \( -path /usr/lib/\* -or -path /usr/bin/\* -or \
-path /etc/\* \)
导致:
find / -type f ( -name *audio* -or -name *alsa* ) \
( -path /usr/lib/busybox /usr/lib/dbus /usr/lib/faketime /usr.... long list of matching file system items follows )
已针对其扩展模式的项目列表表明,扩展发生在目标设备文件系统中,而不是在调用adb shell
的主机上。这意味着全局扩展未在主机上进行。这是因为转义了星号。看起来主机外壳消耗的星号转义了字符并感到满意。然后,未转义的星号转到目标设备外壳,在那里它们被消耗以进行全局扩展。
我自己尝试了许多其他方法来逃避-path模式中的星号。对于所有这些对象,结果都与上述相同。
对于Bash,在其他所有类型的扩展之后都删除引号。不知道它如何在adb目标上的shell上工作。
但是为什么命令分组-肢体-不显示对偶性?分组逃逸被消耗掉了,无论如何分组被传递到目标命令“ find”,就像它是一个单独的shell。这种观察掩盖了上面的论点。
作为输入的命名命题A .. D .. Bridge(adb)的另一个赞成理由,似乎有充分的理由-软件充当两者之间的桥梁-在这种情况下是壳。
在adb shell中,一个处理两个shell链真的是这样吗? 否则如何解释所观察到的结果?可能是adb shell或目标shell的错误吗?
注意:对于这种情况,Busybox在目标系统上运行。
答案 0 :(得分:1)
是的,有两个shell:本地shell和远程shell。
adb shell
使用system(3)
语义,就像ssh
和eval
一样。按照这种约定,所有参数都用空格连接,然后由外壳程序评估。
替代方法是execve(2)
和sudo
使用的xargs
语义。按照这种约定,第一个参数被视为可执行文件名称,其余参数作为参数逐字传递。这就是您要尝试做的事情,通常最好是因为它既安全又健壮,但是adb shell
不支持它。
要使用任意命令运行adb shell
,您必须转义适合远程Shell的值,然后转义整个命令,以便本地Shell正确地传递它。
在这种情况下,您可以简单地将转义的命令用单引号引起来:
adb shell 'echo find / -type f \( -name \*audio\* -or \
-name \*alsa\* \) \( -path /usr/lib/\* -or -path /usr/bin/\* -or \
-path /etc/\* \)'
我无法用括号解释您说的内容。他们肯定应该给我一个错误,他们为我做了:
$ adb shell echo find / -type f \( -name ...
/system/bin/sh: syntax error: '(' unexpected