使用adb pull复制db文件会导致“权限被拒绝”错误

时间:2014-01-02 20:49:19

标签: adb

我刚刚使用此方法植根了我的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错误。

我没有在我尝试访问的应用中设置调试标志。这是我无法访问该文件的原因吗?如果是,是否有任何变通方法可以访问应用程序文件?

15 个答案:

答案 0 :(得分:64)

您可以使用run-as shell命令访问私有应用程序数据。

如果您只想复制数据库,可以使用此提供的代码段 https://stackoverflow.com/a/31504263/998157

adb -d shell "run-as com.example.test cat /data/data/com.example.test/databases/data.db" > data.db

答案 1 :(得分:21)

我遇到了同样的问题。我的工作是使用adb shell和su。接下来,将文件复制到/ sdcard / Download

然后,我可以使用adb pull来获取文件。

答案 2 :(得分:19)

在给予adb remount之后您是否尝试adb root了?

答案 3 :(得分:7)

我遇到了同样的问题,这里有解决方法:

  1. adb shell to the device
  2. ls -l并检查您需要的文件的当前访问权限。你以后会需要它。
  3. 转到所需文件并:chmod 777 file.ext。注意:现在您遇到了临时安全问题。您只是允许所有人享有所有权利!考虑为用户添加R。
  4. 打开另一个控制台,然后:adb pull /path/to/file.ext c:\ pc \ path \ to \ file.exe
  5. 重要提示:完成后,请将访问权限恢复为之前的值(第3点)
  6. 之前有人提到过类似的东西。

    感谢下面的评论。

答案 4 :(得分:7)

如果你得到无法复制和权限是正确的禁用selinux。

检查是否启用了selinux。

$ adb shell
$su
# getenforce
Enforcing

启用了Selinux并阻止/强制执行。 禁用selinux

# setenforce 0

做你的事情并设置selinux来强制执行。

# setenforce 1

答案 5 :(得分:6)

此通用解决方案应适用于所有有根设备:

 adb shell "su -c cat /data/data/com.android.providers.contacts/databases/contacts2.db" > contacts2.d

该命令以shell身份连接,然后以root身份执行cat并将输出收集到本地文件中。

与@ guest-418的解决方案相反,人们不必为有问题的用户挖掘。

加号如果你贪婪并且想要同时拥有所有数据库(例如备份)

for i in `adb shell "su -c find /data -name '*.db'"`; do
    mkdir -p ".`dirname $i`"
    adb shell "su -c cat $i" > ".$i" 
done

这会在文件名的末尾添加一个神秘的问号,但它仍然可读。

答案 6 :(得分:3)

这个答案最终为我工作:https://stackoverflow.com/a/15559278/53001

备份到文件,拉取备份,然后将其转换为tarball并将其解压缩。

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 - 

答案 7 :(得分:1)

执行adb命令时,默认情况下,使用有限权限用户,分配给应用程序的同类有限权限用户,并且您已请求所有privelages使用设备的所有功能

这种有限的用户通过限制应用和系统之间的访问来帮助保护您的手机免受恶意软件的侵害。这是您无法在无根电话上访问应用数据和系统数据的原因。 rooting的行为意味着成为用户0,系统的超级用户,能够执行任何操作,并且是最高权限。但是,您的应用仍然是安全的,因为他们无法互相交谈。

现在,在访问安全文件时,请注意您 希望在访问文件时更改文件的权限,这可能会导致漏洞。

您可以使用的选项是在sdcard上以root身份制作文件的副本,将其作为标准用户进行修改,然后以root身份将其移回文件系统,同时保留文件的权限。原始文件。

答案 8 :(得分:1)

这有点晚了,但安装adbd Insecure对我有用。它使adb在生产(“安全”)设备上以root模式运行,这是你可能拥有的。

如果您想支持开发人员,Google Play也可以使用付费版本。

答案 9 :(得分:1)

自从我更新到Android Oreo后,我不得不使用此脚本修复“权限被拒绝”问题。

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

答案 10 :(得分:1)

$ adb shell
$su
# getenforce
Enforcing

现在尝试

adb shell
su
chmod 777 /path/to/yout_file

从外壳退出

打开新的CMD并尝试adb pull /path/to/yout_file

现在可以正常工作。

您将遇到安全问题,因此任何应用程序都可以访问您的数据库。

答案 11 :(得分:0)

以下是我在Windows上遇到的类似问题。

D:\ProgramFiles\Android> adb pull /data/local/tmp/com.packagename_dumped_1766.dex D:\ProgramFiles\Android\com.packagename_dumped_1766.dex
adb: error: failed to copy '/data/local/tmp/com.packagename_dumped_1766.dex' to 'D:\ProgramFiles\Android\com.packagename_dumped_1766.dex': remote Permission denied

我的解决方案:

起初,我还尝试将cat用作ansi_lumen answered,但是我遇到了CR和LR(\r\n)字符的麻烦。 然后,我只需要通过chmod更改那些文件权限,然后再次解决该问题即可,而不会引入其他问题。之后,可能 我们需要将其原始权限恢复为Goran Devs answered

所以请稍加注意。

TL; DR

我的故事:

首先,我使用cat将所有文件从android下载到我的Windows,

@echo off
cd /d %~dp0
:: %~dp0 = D:\ProgramFiles\Android\
SET ThisBatDir=%~dp0
:: adb shell ls /data/local/tmp/com.packagename_dumped_* > %~dp0\dump_file_list.txt
FOR /f "delims=" %%a in ('adb shell ls /data/local/tmp/com.packagename_dumped_*') do call :processline %%a %%~nxa

goto :eof

:: https://stackoverflow.com/questions/232651/why-the-system-cannot-find-the-batch-label-specified-is-thrown-even-if-label-e
:processline
SET RemoteFullPath=%1
set FileName=%2
:: echo "%RemoteFullPath%|%ThisBatDir%|%FileName%"
call adb shell su -c cat %RemoteFullPath% > %ThisBatDir%%FileName%
goto :eof

:eof

但是,由于Windows上的CR和LR(dex)字符,那些下载的\r\n文件被破坏了。 我们可以使用hexdump以Hex + ASCII格式检查其内容(或在Notepad ++中选中“查看>显示符号>显示所有字符”)。请注意,第5和第6个字节(0d 0a)。

ssfang@MONITO ~
$ hexdump -C -n32 /cygdrive/d/ProgramFiles/Android/com.packagename_dumped_1448.dex # a bad dex
00000000  64 65 78 0d 0d 0a 30 33  35 00 f7 8e e4 b5 03 c6  |dex...035.......|
00000010  29 22 98 55 21 e9 70 49  fe c8 e4 cc fa 94 cd 63  |)".U!.pI.......c|
00000020

ssfang@MONITO ~
$ hexdump -C -n32 /cygdrive/d/ProgramFiles/Android/classes.dex # a normal dex
00000000  64 65 78 0a 30 33 35 00  b5 73 03 3a 0b 9d a2 47  |dex.035..s.:...G|
00000010  a8 78 a4 f0 bb e1 64 3f  e5 b9 cb a0 bd 1b e2 71  |.x....d?.......q|
00000020

Versions

  • adb版本//检查桌面上的adb客户端版本
  • adb shell adbd --version //检查Android中adbd的版本。请注意,如果没有root用户访问权限,则一些用户报告了与此相关的错误。
D:\ProgramFiles\Android>adb version
Android Debug Bridge version 1.0.41
Version 29.0.6-6198805
Installed as D:\ProgramFiles\Android\Sdk\platform-tools\adb.exe

D:\ProgramFiles\Android>adb shell adb version
Android Debug Bridge version 1.0.32

即使以root身份重新启动adbd,也仍然是Shell用户。

D:\ProgramFiles\Android> adb root
restarting adbd as root

D:\ProgramFiles\Android> adb shell id
uid=2000(shell) gid=2000(shell) groups=1003(graphics),1004(input),1007(log),1011(adb),1015(sdcard_rw),1028(sdcard_r),3001(net_bt_admin),3002(net_bt),3003(inet),3006(net_bw_stats) context=u:r:shell:s0

所以我首先查看了它的文件性能,

D:\ProgramFiles\Android> adb shell ls -l /data/local/tmp
-rwsr-sr-x shell    shell      589588 2017-09-14 15:08 android_server
-rwsr-sr-x shell    shell     1243456 2017-09-14 15:08 android_server64
-rw-rw-rw- shell    shell        1536 2020-03-28 17:15 com.packagename.tar.gz
-rw-r----- root     root        57344 2020-03-28 17:45 com.packagename_dumped_1766.dex
drwxrwxr-x shell    shell             2018-08-12 09:48 device-explorer
-rwsrwsr-x shell    shell       13592 2019-02-04 17:44 drizzleDumper
-rwxrwxrwx shell    shell     5512504 2018-05-06 01:27 lldb-server
-rwxr-xr-x shell    shell       12808 2020-03-26 22:16 mprop

然后,更改其渗透性,

D:\ProgramFiles\Android> adb shell su -c chmod 777 /data/local/tmp/com.packagename_dumped_*

D:\ProgramFiles\Android> adb shell ls -l /data/local/tmp
-rwxrwxrwx root     root        57344 2020-03-28 17:45 com.packagename_dumped_1766.dex

结果,我做到了。

D:\ProgramFiles\Android> adb pull /data/local/tmp/com.packagename_dumped_1766.dex D:\ProgramFiles\Android\com.packagename_dumped_1766.dex
/data/local/tmp/com.packagename_dumped_1766.de... 1 file pulled, 0 skipped. 3.6 MB/s (57344 bytes in 0.015s)

现在,jadx-gui-dev.exesh d2j-dex2jar.sh -f ~/path/to/apk_to_decompile.apk可以正常享用它们。

答案 12 :(得分:0)

@ guest-418提示效果很好:

adb -d shell "run-as com.example.test cat /data/data/com.example.test/databases/data.db" > data.db

但是,如果要使用GUI,请使用 Android Studio的设备文件资源管理器

  1. 启动 Android Studio

  2. 点击右下角的设备文件浏览器 导航到您应用的文件:

    /data/data/path.to.package/databases/data

  3. 右键单击并选择另存为,然后保存到本地文件夹

我最近在macOS上挂了 Android Monitor 设备文件资源管理器可很好地用于此目的。

答案 13 :(得分:0)

  1. 在sdcard中创建一个文件夹:
interactive_shell
  1. 将文件移动到新文件夹:
adb shell "su 0 mkdir /sdcard/com.test"
  1. 您现在可以使用adb pull了:
adb shell "su 0 mv -F /data/data/com.test/files/ /sdcard/com.test/"

答案 14 :(得分:-5)

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