Shell 命令可以在本地运行,但无法通过 ssh 正确解析

Shell 命令可以在本地运行,但无法通过 ssh 正确解析

如果我在本地执行以下 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 脚本中,然后调用该脚本,则可能会为您省去一些麻烦。

相关内容