Копирование файлов в оболочке АБР с помощью run-as
Есть ли способ написать script, который скопирует файлы из оболочки ADB с помощью run-as?
Единственный способ, который я знаю для копирования в оболочке adb, - это использовать cat source > dest
(изменить: современные версии для Android имеют команду cp
, что делает этот вопрос ненужным), но я могу только процитировать большую версию, чем знак одного уровня в глубину - так что мой script может передать его в оболочку adb, но не для adb shell run-as.
Например, это работает:
adb shell "cat source > dest"
Но это не так:
adb shell run-as "cat source > dest"
И это:
adb shell "run-as cat source \> dest"
Я даже попытался создать небольшой script и загрузить его на устройство, но я не могу запустить script из оболочки adb - он говорит мне, что "разрешено отклонение". Я также не могу chmod script.
Причина, по которой я хочу сделать это, - это скопировать файл в частную область хранения приложения - в частности, я использую script для изменения общих настроек и возврата измененных настроек. Однако только само приложение или корень могут писать в файл, который я хочу.
Вариант использования в этом сценарии - это копирование файла в защищенное место на устройстве, а не его получение; для извлечения уже есть хорошие ответы в на этот вопрос.
Ответы
Ответ 1
OP попытался объединить следующие 3 команды (которые он не имел проблем, выполняющих один за другим в сеансе интерактивной оболочки) в одну неинтерактивную команду:
adb shell
run-as com.example.app
cat /sdcard/temp_prefs.xml > shared_prefs/com.example.app_preferences.xml
Для простоты можно начать с интерактивного сеанса adb shell
. Если мы просто попытаемся объединить последние две команды в одну строку:
run-as com.example.app cat /sdcard/temp_prefs.xml > shared_prefs/com.example.app_preferences.xml
Это не сработает из-за того, что перенаправление оболочки работает - только часть cat /sdcard/temp_prefs.xml
команды будет запущена с помощью com.example.app
UID
Многие люди "знают", чтобы включить часть команды в перенаправление в кавычки:
run-as com.example.app "cat /sdcard/temp_prefs.xml > shared_prefs/com.example.app_preferences.xml"
Это не работает, потому что команда run-as
недостаточно умна для синтаксического анализа всей команды. Он ожидает, что исполняемый файл станет следующим параметром. Правильный способ сделать это: вместо этого использовать sh
:
run-as com.example.app sh -c "cat /sdcard/temp_prefs.xml > shared_prefs/com.example.app_preferences.xml"
Итак, можем ли мы просто добавить команду adb shell
в команду и сделать с ней? Не обязательно. Запустив команду с вашего ПК, вы также добавите другую локальную оболочку и ее синтаксический анализатор. Специфические требования к побегу будут зависеть от вашей ОС. В Linux или OSX (если ваша команда еще не содержит никаких '
), легко оцифровать всю команду следующим образом:
adb shell 'run-as com.example.app sh -c "cat /sdcard/temp_prefs.xml > shared_prefs/com.example.app_preferences.xml"'
Но иногда проще использовать альтернативные решения с (-out или less) кавычками:
adb shell run-as com.example.app cp /sdcard/temp_prefs.xml shared_prefs/com.example.app_preferences.xml
Или если ваше устройство не имеет команды cp
:
adb shell run-as com.example.app dd if=/sdcard/temp_prefs.xml of=shared_prefs/com.example.app_preferences.xml
Также обратите внимание, как я использовал shared_prefs/com.example.app_preferences.xml
вместо полного /data/data/com.example.app/shared_prefs/com.example.app_preferences.xml
- обычно внутри команды run-as
ваш текущий каталог является HOME
dir вашего пакета.
Ответ 2
Следуя совету Криса Страттона, способ, которым я в конечном итоге получил это, был следующим (для копирования общих настроек на устройство):
adb push shared_prefs.xml /sdcard/temp_prefs.xml
cat <<EOF | adb shell
run-as com.example.app
cat /sdcard/temp_prefs.xml > /data/data/com.example.app/shared_prefs/com.example.app_preferences.xml
exit
exit
EOF
Трубопровод непосредственно на adb shell run-as
не работал, и я не знаю, почему, но соединение с adb shell
выполняется. Хитрость заключается в том, чтобы затем вызвать run-as из интерактивной оболочки и продолжать принимать входные данные из канала.
ДЕЙСТВИТЕЛЬНО doc позволяет мне легко вставлять новые строки для разделения команд и, как правило, просто читает их; Мне не повезло с точкой с запятой, но это могло быть из-за того, как я делал что-то. Я считаю, что он может работать с другими методами соединения нескольких команд/новых строк; Я остановил эксперимент, как только я, наконец, получил его на работу.
Два выхода необходимы, чтобы предотвратить зависание оболочки (killable с CTRL-C); один для run-as
, а другой для adb shell
. Похоже, что оболочка Adb не отвечает на конец файла.
Ответ 3
вы можете просто изменить разрешение каталога, а затем вытащить все файлы. но для меня я искал только один файл общих предпочтений, и мне удалось получить такие данные:
PACKAGE='com.mypackage.cool'
SHAREDPREF_FILE="${PACKAGE}_preferences.xml"
adb shell "run-as $PACKAGE cat /data/data/$PACKAGE/shared_prefs/$SHAREDPREF_FILE">$SHAREDPREF_FILE
теперь мы имеем данные файла sharedpreference, хранящегося в одноименном файле.