다음 셸 명령을 로컬에서 실행하면 예상된 결과를 얻습니다.
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 디버그 브리지입니다 123456789
. 외부 그룹은 " "
셸에서 실행되어야 하는 명령을 캡슐화하는 데 사용됩니다. 내부 컬렉션은 ' '
she 쉘에서 수퍼유저로 실행해야 하는 명령 세트를 캡슐화하는 데 사용됩니다. 이 모든 것이 잘 작동하고 예상한 결과를 얻습니다.
그러나 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가 따옴표를 보내는 대신 해석하고 있다는 것입니다. \
, 즉 를 사용하여 따옴표를 이스케이프해 보세요 \"
. 한번 시도해 볼 수도 있습니다. 인용이 필요한 명령을 원격으로 실행하는 것은 항상 까다롭습니다.
이는 귀하의 환경에서는 불가능할 수도 있지만 원격 시스템의 쉘 스크립트에 긴 명령을 생성한 다음 해당 스크립트를 호출할 수 있다면 문제를 줄일 수 있습니다.