O comando shell funciona localmente, mas não é analisado corretamente por meio do ssh

3

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.

    
por Andrew Mpy 24.09.2014 / 01:19

1 resposta

1

Eu acho que o problema é que bash na sua máquina local está interpretando aspas e não as enviando. Tente escapar das aspas com \ , ou seja, \" . Você pode ter que experimentar. A execução remota de comandos que exigem cotação é sempre complicada.

Isso pode não ser possível em seu ambiente, mas se você puder criar esse comando longo em um script de shell na máquina remota e chamar esse script, isso poderá poupar um pouco de dor de cabeça.

    
por 24.09.2014 / 05:42