Se eu executar o seguinte comando shell localmente, obtenho o resultado esperado:
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;'"
Basicamente, adb é a ponte de depuração do Android e eu a uso para abrir um shell no dispositivo 123456789. O conjunto externo de "" é usado para encapsular os comandos que devem ser executados no shell. O conjunto interno de '' é usado para encapsular o conjunto de comandos que devem ser executados como um superusuário em shell. Tudo isso funciona corretamente e recebo o resultado esperado.
No entanto, se eu tentar executar este comando através do 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;'"
Os comandos não são analisados corretamente e recebo os seguintes erros:
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
O que me leva a acreditar que os comandos não são analisados corretamente. Eu tentei encapsular o comando ssh'd assim, mas não funcionou (eu tentei com aspas simples e duplas):
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;'""
Eu não sou um grande usuário do Linux e tentei pesquisar, mas não consegui nada. Existe uma maneira de executar meu comando através do ssh?
EDITAR:
Eu pareço ter apontado o problema. Se eu executar esse comando simples, tudo funcionará perfeitamente:
ssh root @ adb shell "su -c 'ls -l'"
Se eu executar dois comandos sem parâmetros, também recebo a saída esperada:
ssh root @ adb shell "su -c 'ls; ls'"
No entanto, se eu executar os dois comandos e se ambos os comandos tiverem um parâmetro adicional, recebo um erro:
ssh root @ adb shell "su -c 'ls -l; ls -l'"
O primeiro comando é executado corretamente (recebo uma lista com o parâmetro -l), mas em vez de obter a lista de arquivos uma segunda vez, recebo a mensagem "/ system / bin / sh: ls -l: not found" . O que está acontecendo? Isso deve ser mais simples de solucionar do que minha primeira postagem, que tinha comandos longos e específicos com várias citações aninhadas.