如果我在本地执行以下 shell 命令,我会得到预期的结果:
adb -s 123456789 shell "su -c 'mount -o remount,rw /system;rm -r /system/app/MyApp.apk;cp /sdcard/MyApp.apk /system/app/MyApp.apk;chmod 644 /system/app/MyApp.apk;'"
基本上,adb
就是 Android 调试桥,我用它在设备上打开 shell 123456789
。外层的一组" "
用于封装必须在shell中执行的命令。内部集合' '
用于封装必须在 she shell 上以超级用户身份执行的命令集。所有这些工作正常,我得到了预期的结果。
但是,如果我尝试通过 ssh 执行此命令:
ssh -i <path to rsa id file> root@<address> adb -s 123456789 shell "su -c 'mount -o remount,rw /system;rm -r /system/app/MyApp.apk;cp /sdcard/MyApp.apk /system/app/MyApp.apk;chmod 644 /system/app/MyApp.apk;'"
命令无法正确解析,并且出现以下错误:
Usage: su [options] [--] [-] [LOGIN] [--] [args...] Options: --daemon start the su daemon agent -c, --command COMMAND pass COMMAND to the invoked shell -h, --help display this help message and exit -, -l, --login pretend the shell to be a login shell -m, -p, --preserve-environment do not change environment variables -s, --shell SHELL use SHELL instead of the default /system/bin/sh -u display the multiuser mode and exit -v, --version display version number and exit -V display version code and exit, this is used almost exclusively by Superuser.apk mount: can't find /data in /etc/fstab rm: cannot remove '/system/app/MyApp.apk': No such file or directory cp: cannot stat '/sdcard/MyApp.apk': No such file or directory chmod: cannot access '/system/app/MyApp.apk': No such file or directory
这让我相信这些命令没有被正确解析。我尝试像这样封装 ssh'd 命令,但它不起作用(我尝试使用单引号和双引号):
ssh -i <path to rsa id file> root@<address> "adb -s 123456789 shell "su -c 'mount -o remount,rw /system;rm -r /system/app/MyApp.apk;cp /sdcard/MyApp.apk /system/app/MyApp.apk;chmod 644 /system/app/MyApp.apk;'""
我不是一个大的 Linux 用户,我尝试四处搜索,但一无所获。有没有办法通过 ssh 执行我的命令?
编辑:
我似乎已经指出了问题所在。如果我执行这个简单的命令,一切都会完美运行:
ssh root@<address> adb shell "su -c 'ls -l'"
如果我执行两个不带参数的命令,我也会得到预期的输出:
ssh root@<address> adb shell "su -c 'ls;ls'"
但是,如果我执行这两个命令并且这两个命令都有附加参数,则会收到错误:
ssh root@<address> adb shell "su -c 'ls -l;ls -l'"
第一个命令正确运行(我得到一个带有参数的列表-l
),但我收到消息时没有第二次获取文件列表/system/bin/sh: ls -l: not found
。到底是怎么回事?这应该比我的第一篇文章更容易排除故障,因为我的第一篇文章包含带有多个嵌套引号的长而特定的命令。
答案1
我认为问题在于本地计算机上的 bash 正在解释引号而不是发送它们。尝试使用\
, ie转义引号\"
。你可能需要尝试一下。远程执行需要引用的命令总是很棘手。
这在您的环境中可能是不可能的,但如果您可以将这么长的命令创建到远程计算机上的 shell 脚本中,然后调用该脚本,则可能会为您省去一些麻烦。