Копирование файлов в оболочке АБР с помощью 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, хранящегося в одноименном файле.