シェルコマンドはローカルで動作しますが、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'"

ただし、これら2つのコマンドを実行し、両方のコマンドに追加のパラメータがあると、エラーが発生します。

ssh root@<address> adb shell "su -c 'ls -l;ls -l'"

最初のコマンドは正しく実行されますが(パラメータを含むリストを取得します-l)、2番目のコマンドではファイルのリストを取得せずにメッセージのみが表示されます/system/bin/sh: ls -l: not found。どうしたの?複数のネストされた引用符を持つ長くて具体的なコマンドを含む最初の投稿よりも問題を解決するのは簡単です。

ベストアンサー1

問題は、ローカルコンピュータのbashが引用符を送信する代わりに解釈していることです。\つまり、を使用して引用符をエスケープしてください\"。一度試してみることもできます。引用が必要なコマンドをリモートで実行するのは常に難しいです。

これはあなたの環境では不可能かもしれませんが、リモートシステムのシェルスクリプトに長いコマンドを生成し、そのスクリプトを呼び出すことができれば問題を減らすことができます。

おすすめ記事