次のシェルコマンドをローカルで実行すると、期待される結果が得られます。
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が引用符を送信する代わりに解釈していることです。\
つまり、を使用して引用符をエスケープしてください\"
。一度試してみることもできます。引用が必要なコマンドをリモートで実行するのは常に難しいです。
これはあなたの環境では不可能かもしれませんが、リモートシステムのシェルスクリプトに長いコマンドを生成し、そのスクリプトを呼び出すことができれば問題を減らすことができます。