Копировать db файл с результатами adb pull при ошибке "permission denied"
Я только что связал свой Nexus 5 с помощью этого метода: http://www.phonearena.com/news/How-to-root-Google-Nexus-5_id49014
Я также включил USB-отладку в настройках разработчика.
Затем я попытался вытащить файл базы данных с моего устройства с помощью этой команды:
adb pull /data/data/path.to.package/databases/data /sdcard/test
Я получаю ошибку permission denied
.
У меня нет отладочного флага, установленного в этом приложении, к которому я пытался получить доступ. Это причина, по которой я не могу получить доступ к этому файлу? Если да, есть ли какие-либо обходные пути для доступа к файлам приложений?
Ответы
Ответ 1
Вы можете использовать команду оболочки run-as
для доступа к частным данным приложения.
Если вы хотите копировать базу данных, вы можете использовать этот фрагмент, указанный в
fooobar.com/questions/91603/...
adb -d shell "run-as com.example.test cat /data/data/com.example.test/databases/data.db" > data.db
Ответ 2
У меня была та же проблема. Моя работа - использовать adb shell и su. Затем скопируйте файл в/sdcard/Загрузить
Затем я могу использовать adb pull для получения файла.
Ответ 3
Вы попробовали adb remount
после предоставления adb root
?
Ответ 4
У меня была такая же проблема, вот как с этим справиться:
- оболочка adb на устройство
- су
- ls -l и проверьте текущие права доступа к файлу, который вам нужен. Это вам понадобится позже.
- перейдите в необходимый файл и: chmod 777 file.ext. Примечание: теперь у вас есть временная проблема безопасности. Вы только что разрешили все права всем! Подумайте о добавлении только R для пользователей.
- откройте другую консоль и: adb pull/path/to/file.ext c:\pc\path\to\file.exe
- Важно: после того, как вы закончите, верните права доступа к предыдущему значению (пункт 3)
Кто-то упомянул что-то подобное раньше.
Спасибо за комментарии ниже.
Ответ 5
Этот ответ оказался для меня полезным: fooobar.com/questions/91603/...
Резервное копирование в файл, извлечение резервной копии, а затем преобразование его в архив и извлечение его.
adb backup -f myAndroidBackup.ab com.corp.appName
dd if=myAndroidBackup.ab bs=1 skip=24 | python -c "import zlib,sys;sys.stdout.write(zlib.decompress(sys.stdin.read()))" | tar -xvf -
Ответ 6
Если вы не можете скопировать и разрешить право отключить selinux.
Проверьте, включено ли selinux.
$ adb shell
$su
# getenforce
Enforcing
Selinux включен и блокируется/принудительно.
Отключить selinux
# setenforce 0
сделайте свой материал и настройте selinux для обеспечения соблюдения.
# setenforce 1
Ответ 7
Это общее решение должно работать на всех корневых устройствах:
adb shell "su -c cat /data/data/com.android.providers.contacts/databases/contacts2.db" > contacts2.d
Команда подключается как оболочка, затем выполняет cat
как root и собирает вывод в локальный файл.
В отличие от решения @guest-418 s, не нужно копать для данного пользователя.
Плюс Если вы получаете жадность и хотите, чтобы все db сразу (например, для резервного копирования)
for i in `adb shell "su -c find /data -name '*.db'"`; do
mkdir -p ".`dirname $i`"
adb shell "su -c cat $i" > ".$i"
done
Это добавляет загадочный вопросительный знак в конец имени файла, но он все еще доступен для чтения.
Ответ 8
При выполнении команд adb
по умолчанию используется пользователь с ограниченными правами, тот же самый пользователь с ограниченными правами, который назначен для приложения, и вы попросили все приставки использовать все функции устройства.
Этот ограниченный пользователь помогает защитить ваш телефон от вредоносного ПО, ограничивая доступ между приложениями и системой. Это причина, по которой вы не можете получить доступ к данным приложения и системным данным на неподходящем телефоне. Акт rooting
означает стать пользователем 0
, суперпользователем системы, способным к любым действиям, и является высшей привилегией. Однако ваши приложения по-прежнему безопасны тем, что они не могут разговаривать друг с другом.
Теперь при доступе к защищенным файлам обратите внимание, что вы не хотите изменять разрешения файла при доступе к нему, что может позволить уязвимости.
Опция, которую вы можете использовать вместо этого, заключается в том, чтобы сделать копию файла на SD-карте с правами root, изменить ее как стандартного пользователя и затем перенести обратно в файловую систему с правами root, сохраняя при этом права доступа к файлу исходный файл.
Ответ 9
Это немного поздно, но для меня работала adbd Insecure. Это заставляет adb работать в корневом режиме на производственных ( "защищенных" ) устройствах, что, вероятно, есть.
Платная версия также доступна в Google Play, если вы хотите поддержать разработчика.
Ответ 10
Поскольку я обновился до Android Oreo, мне пришлось использовать этот script для исправления проблемы с разрешением.
Этот script в Mac OS X скопирует ваш db файл на рабочий стол. Просто измените его, чтобы он соответствовал вашим ADB_PATH, DESTINATION_PATH и PACKAGE NAME.
#!/bin/sh
ADB_PATH="/Users/xyz/Library/Android/sdk/platform-tools"
PACKAGE_NAME="com.example.android"
DB_NAME="default.realm"
DESTINATION_PATH="/Users/xyz/Desktop/${DB_NAME}"
NOT_PRESENT="List of devices attached"
ADB_FOUND=`${ADB_PATH}/adb devices | tail -2 | head -1 | cut -f 1 | sed 's/ *$//g'`
if [[ ${ADB_FOUND} == ${NOT_PRESENT} ]]; then
echo "Make sure a device is connected"
else
${ADB_PATH}/adb exec-out run-as ${PACKAGE_NAME} cat files/${DB_NAME} > ${DESTINATION_PATH}
fi
Ответ 11
Команда pull
:
adb pull source dest
Когда вы пишете:
adb pull /data/data/path.to.package/databases/data /sdcard/test
Это означает, что вы вытащите из /data/data/path.to.package/databases/data
, и вы скопируете его в /sdcard/test
, но пункт назначения ДОЛЖЕН быть локальным каталогом. Вместо этого вы можете написать C:\Users\YourName\temp
.
Например:
adb pull /data/data/path.to.package/databases/data c:\Users\YourName\temp