Копирование файлов в Shell ADB в с запуска

есть ли способ написать сценарий, который будет копировать файлы из оболочки ADB с помощью run-as?

единственный способ скопировать в оболочку adb-использовать cat source > dest (edit: современные версии android имеют cp команда, которая делает этот вопрос ненужным), но я могу только процитировать больше, чем подписать один уровень глубоко, поэтому мой скрипт может передать его в adb shell, но не в adb shell run-as.

например, это работает:

adb shell "cat source > dest"

но это не:

adb shell run-as "cat source > dest"

ни этот:

adb shell "run-as cat source > dest"

Я даже попытался создать небольшой скрипт и загрузить его на устройство, но я не могу запустить скрипт из оболочки adb - он говорит мне "отказано в разрешении". Я тоже не могу изменить сценарий.

причина, по которой я хочу это сделать, - скопировать файл в частную область хранения приложения - в частности, я использую скрипт для измените общие настройки и верните измененные настройки. Однако только само приложение или root могут записывать в файл, который я хочу.

вариант использования в этом сценарии справляется с файлом в защищенном месте на устройстве, а не извлекает его; для извлечения уже есть хорошие ответы в этот вопрос.

3 ответов


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 к команде и покончить с этим? Необязательно. От запуск команды с вашего ПК вы также добавляете еще одну локальную оболочку и ее парсер. Конкретные требования к escape будут зависеть от вашей ОС. В Linux или OSX (если ваша команда еще не содержит ') легко процитировать всю команду так:

adb shell 'run-as com.example.app sh -c "cat /sdcard/temp_prefs.xml > shared_prefs/com.example.app_preferences.xml"'

но иногда просто проще использовать альтернативные решения с (- out или менее) кавычками:

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 вместо full /data/data/com.example.app/shared_prefs/com.example.app_preferences.xml - обычно внутри run-as команда ваш текущий каталог является HOME dir вашего пакета.


следуя совету Криса Страттона, способ, которым я в конечном итоге получил это, был следующим (для копирования общих настроек обратно на устройство):

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 позволяет мне легко вставлять новые строки для разделения команд и в целом просто делает это читаемый; мне не очень повезло с точкой с запятой, но это могло быть из-за того, как я делал вещи. Я считаю, что это может работать с другими методами передачи нескольких команд/новых строк; я остановил эксперимент, как только я, наконец, получил его работу.

два выхода необходимы для предотвращения зависания оболочки (убивается с помощью CTRL-C); один для run-as, а другой . Похоже, оболочка Adb не очень хорошо реагирует на конец файла.


вы можете просто изменить разрешение каталога,а затем вытащить все файлы. но для меня я искал только один общий файл предпочтений, и я смог получить данные следующим образом:

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, хранящиеся в файле с тем же именем.