셸 명령은 로컬에서 작동하지만 SSH를 통해 올바르게 구문 분석되지 않습니다.

셸 명령은 로컬에서 작동하지만 SSH를 통해 올바르게 구문 분석되지 않습니다.

다음 셸 명령을 로컬에서 실행하면 예상된 결과를 얻습니다.

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가 따옴표를 보내는 대신 해석하고 있다는 것입니다. \, 즉 를 사용하여 따옴표를 이스케이프해 보세요 \". 한번 시도해 볼 수도 있습니다. 인용이 필요한 명령을 원격으로 실행하는 것은 항상 까다롭습니다.

이는 귀하의 환경에서는 불가능할 수도 있지만 원격 시스템의 쉘 스크립트에 긴 명령을 생성한 다음 해당 스크립트를 호출할 수 있다면 문제를 줄일 수 있습니다.

관련 정보