Копировать 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