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