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

use*_*120 38 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
Run Code Online (Sandbox Code Playgroud)

我收到permission denied错误.

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

gue*_*418 77

您可以使用run-asshell命令访问私有应用程序数据.

如果您只想复制数据库,可以使用/sf/answers/2205298441/中提供的此代码段.

adb -d shell "run-as com.example.test cat /data/data/com.example.test/databases/data.db" > data.db
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案!对于从模拟器抓取的任何人,请忽略“-d”选项。 (5认同)
  • 这会抛出 run-as: package not debuggable: (3认同)
  • 这是唯一适用于我的普通电话的解决方案。谢谢! (2认同)
  • 我收到“未找到设备”错误。尽管模拟器正在运行。 (2认同)

小智 22

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

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

  • 我试图用cp复制并得到"cp:not found".使用"cat source> destination"进行管理. (2认同)

Anv*_*thy 19

adb remount在给予后尝试了adb root吗?

  • adb root给了我一个错误:'adbd无法在生产版本中以root身份运行'.重装也失败了...... (6认同)

Gor*_*evs 7

我有同样的问题,这是如何处理它:

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

有人早先提到了类似的东西.

感谢下面的评论.

  • **不不不**!你为什么要这样做?可怕的答案.这允许`Owner`,`User`和`Other`的开放权限公开`Read`,`Write`,`Execute`.如果这是一个你需要`root`访问的文件,那么它就像一个其他一些流氓应用程序无法触及的文件.不要这样做.我的建议是复制文件`system - > sdcard - > computer`,然后从sdcard中删除.把文件放回文件系统,`computer - > sdcard - > system - > strict permissions`. (15认同)
  • 我同意这是一个安全问题,但它是一个快速解决方案,旨在让开发人员不要浪费时间在琐事上. (7认同)
  • 你不能在设备上使用“su” (2认同)
  • @MattClark,所以你说这是*哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇 禁用SeLinux似乎对我来说并不安全,这是"唯一有效"的唯一解决方案! (2认同)

小智 7

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

检查是否启用了selinux.

$ adb shell
$su
# getenforce
Enforcing
Run Code Online (Sandbox Code Playgroud)

Selinux已启用并阻止/强制执行.禁用selinux

# setenforce 0
Run Code Online (Sandbox Code Playgroud)

做你的东西并设置selinux来执行.

# setenforce 1
Run Code Online (Sandbox Code Playgroud)


ans*_*men 6

此通用解决方案应在所有植根设备上工作:

 adb shell "su -c cat /data/data/com.android.providers.contacts/databases/contacts2.db" > contacts2.d
Run Code Online (Sandbox Code Playgroud)

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

与@ 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
Run Code Online (Sandbox Code Playgroud)

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


Ken*_*ora 5

这个答案最终对我有用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 - 
Run Code Online (Sandbox Code Playgroud)


Mai*_*aik -6

命令pull是:

adb pull source dest
Run Code Online (Sandbox Code Playgroud)

当你写:

adb pull /data/data/path.to.package/databases/data /sdcard/test
Run Code Online (Sandbox Code Playgroud)

这意味着您将从 中提取/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
Run Code Online (Sandbox Code Playgroud)