使用adb时,为什么我会拒绝访问数据文件夹?

gre*_*egm 174 android adb

我使用adb和以下命令连接到我的live设备:

C:\>adb -s HT829GZ52000 shell
$ ls
ls
sqlite_stmt_journals
cache
sdcard
etc
system
sys
sbin
proc
logo.rle
init.trout.rc
init.rc
init.goldfish.rc
init
default.prop
data
root
dev
$ cd data
cd data
$ ls
ls
opendir failed, Permission denied
Run Code Online (Sandbox Code Playgroud)

我惊讶地发现我有访问被拒绝.为什么我不能使用这样的命令行浏览目录?

如何在手机上获得root访问权限?

Ido*_*lon 209

从API级别8(Android 2.2)开始,对于可调试应用程序(除非请求发布版本,所有时间由Android Studio构建的应用程序),您可以使用shell run-as命令作为特定用户/应用程序运行命令或可执行文件或者只是切换到应用程序的UID,以便访问其数据目录.

列出yourapp的目录内容:

run-as com.yourapp ls -l /data/data/com.yourapp
Run Code Online (Sandbox Code Playgroud)

切换到com.yourapp的 UID 并使用该uid运行所有其他命令(直到你调用exit):

run-as com.yourapp
cd /data/data/com.yourapp
ls -l
exit
Run Code Online (Sandbox Code Playgroud)

 
注1:某些HTC Desire手机存在已知问题.由于/data/data目录的非标准所有者/权限,run-as命令无法在这些手机上运行.

注2:正如@Avio的评论所指出的那样: run-as在任何版本(从7到10.1)运行Cyanogenmod的三星Galaxy S手机也存在问题,因为在这个平台上/data/data是一个符号链接/datadata.解决此问题的一种方法是将symlink替换为实际目录(遗憾的是,这通常需要root访问权限).

  • 当列出存储在内部存储中的文件时,就像魅力一样. (5认同)
  • 我必须更改文件的权限才能将其移动到我的SD卡,因为我无法将其作为我的应用程序运行.所以,1)run-as com.package.example,chmod 777 databasefile.db.2)退出,转到sdcard,cp /data/data/com.package.example/databases/databasefile.db.第3步应该恢复777权限 (5认同)
  • 无论我把它拼写到我的终端是多么正确,我的包裹都是未知的:( (3认同)
  • 这可以解释你在`run-as com.mypackage`的位置.我遇到的问题是`sqlite3/data/data/com.mypackage/databases/mydb`说"sqlite3:permission denied".sqlite3只能由root运行吗? (2认同)
  • 这应该是标记正确的答案,因为这是用于非根电话的正确方法. (2认同)

Ret*_*ier 134

如果要浏览设备上的所有内容,有两件事需要记住.

  1. 您需要拥有root权限的手机才能浏览Android手机上的数据文件夹.这意味着您要么拥有开发者设备(ADP1或来自Google I/O 的ION),要么您已经找到了一种以其他方式"根"您手机的方法.
  2. 您需要以root模式运行ADB,执行以下操作: adb root

  • 并且"adb root"需要自定义构建的adb,否则"adbd无法在生产版本中以root身份运行" (72认同)
  • 自定义构建adb?我在哪里可以得到它? (14认同)
  • @Gopinath问题的任何答案? (9认同)
  • AFAIK,没有必要自定义构建adb.必须让*adbd*支持以root身份运行,但是这个adbd在设备上 - 所以无论做什么修改以使设备具有root访问权限就足够了. (4认同)
  • @Gopinath:我相信你必须从目标设备的源代码构建它,配置为允许root用户使用ndk然后将其与二进制文件的映像一起闪存到设备上. (2认同)
  • 这不应该是公认的答案.请参阅以下Idolon的答案. (2认同)

abb*_*ood 46

在我们开始之前,你有电话吗?如果没有,我强烈建议你跳跃的时候了.99%的帮助你做这个的教程要求你有一个带根电话(我知道b/c我花了大约一个小时寻找一种方法,没有一个root电话..找不到任何.. )如果你考虑一下,你的iPhone也必须根植于同样的任务.所以这是完全合理的.更多关于在答案结束时生根的内容.

从您的命令行类型:

adb shell
Run Code Online (Sandbox Code Playgroud)

这会将你带到你的android shell命令行(你应该看到这样的东西:shell@android:/ $现在输入:

shell@android:/ $run-as com.domain.yourapp
Run Code Online (Sandbox Code Playgroud)

这应该直接带你到以下数据目录com.domain.yourapp:

shell@android:/data/data/com.domain.yourapp $ 
Run Code Online (Sandbox Code Playgroud)

如果没有(即如果你收到错误)那么你可能没有root电话,或者你没有使用root用户权限.要使用您的root用户权限,请su在adb命令行上输入并查看会发生什么,如果您收到错误,那么您的手机不是root.如果不是,请先将其root化,然后继续执行这些说明.

从那里你可以输入ls,你会看到所有的目录,包括dbs:

shell@android:/data/data/com.domain.yourapp $ ls

cache
databases
lib
shared_prefs   
Run Code Online (Sandbox Code Playgroud)

之后你可以使用sqlite3来浏览dbase ..如果你没有安装它(你可以通过输入找到它sqlite3,如果你command not found那么你就必须安装它.要安装sqlite,请按照这里的说明操作.

关于生根:如果你以前从来没有植根过手机,而且你担心它会搞砸你的手机,我可以完全放心地告诉你,没有什么可担心的.几乎所有的新旧机型都有大量快速简便的手机生根教程,即使你有一台mac(我用我的mac生根了我的s3),你也可以根据自己的手机.

  • 你不需要扎根手机让'run-as`工作.我刚刚在生产构建的Galaxy Nexus S上尝试过它. (8认同)

Hel*_*rld 40

$ adb shell

$ cd/data

$ ls

opendir失败,权限被拒绝


你应该做这个:

$ adb shell

$ cd /data

shell@android:/data $ run-as com.your.package 

shell@android:/data/data/com.your.package $ ls
Run Code Online (Sandbox Code Playgroud)

好!

  • 很好的命令,但它只有在程序包可调试时才有效 (12认同)

ryt*_*tis 29

当我尝试在有根的三星Galaxy S上操作时,我遇到了类似的问题.从计算机外壳发出命令

> adb root
Run Code Online (Sandbox Code Playgroud)

失败并显示消息"无法在生产版本中以root身份运行".这是一个允许成为root的简单方法.

而不是前一个,一个接一个地发出以下两个命令

> adb shell
$ su
Run Code Online (Sandbox Code Playgroud)

在第一个命令之后,如果提示已从'>'更改为'$',如上所示,则表示您已进入adb shell环境.如果随后在发出第二个命令后提示已更改为"#",则表示您现在是root用户.现在,作为root,您可以使用您的设备执行任何操作.

要切换回'安全'shell,请发出

# exit
Run Code Online (Sandbox Code Playgroud)

您将看到提示符'$'再次出现,这意味着您作为用户而不是root用户身在adb shell中.

  • / system/bin/sh:su:未找到 (13认同)
  • su:许可被拒绝 (11认同)
  • 太好了,谢谢!顺便说一句,你需要有一个root用户手机才能做到这一点.您可能还需要SuperSU或类似的东西?至少当我尝试使用"su"时,SuperSU在我的手机上给了我一个对话框. (3认同)
  • 我不能使用su,Nexus 5/Android 5.1 - 有解决方法吗? (3认同)

MSq*_*are 19

我也遇到了很多麻烦.我仍然不完全理解权限和root运行,但这对我(部分先前的答案之一)起作用,从/ data/data/[package name] /databases/my_db.db复制数据库文件.由于某种原因在shell中运行shell rootsu不起作用,也没有复制db文件(我可以导航到目录),sqlite3也没有.

所以,这有效!在DOS命令提示符下:

C:\Program Files\Android\android-sdk\platform-tools>adb shell
1|shell@android:/ $ run-as de.vogella.android.locationapi.maps
run-as de.vogella.android.locationapi.maps
1|shell@android:/data/data/de.vogella.android.locationapi.maps $ cd /data
cd /data
shell@android:/data $ cd data
cd data
shell@android:/data/data $ cd de.vogella.android.locationapi.maps
cd de.vogella.android.locationapi.maps
shell@android:/data/data/de.vogella.android.locationapi.maps $ cd databases
cd databases
shell@android:/data/data/de.vogella.android.locationapi.maps/databases $ ls
ls
bus_timetable_lines.db
bus_timetable_lines.db-journal
shell@android:/data/data/de.vogella.android.locationapi.maps/databases $ cat bus
_timetable_lines.db > /sdcard/db_copy.db
 bus_timetable_lines.db > /sdcard/db_copy.db                                   <
shell@android:/data/data/de.vogella.android.locationapi.maps/databases $exit   ^
exit
shell@android:/ $ exit
exit

C:\Program Files\Android\android-sdk\platform-tools>
Run Code Online (Sandbox Code Playgroud)

现在转到SDCARD目录并获取文件db_copy.db.即使这是隐藏的,但我设法通过电子邮件发送.回到Windows,我能够使用SQLite数据库浏览器打开db文件.:)


ros*_*net 5

如果您的 Android 设备已通过任何方式获得 root 权限,则此方法有效(不确定是否适用于未 root 的情况)。

  1. adb shell- 访问外壳
  2. su- 成为超级用户。

您现在可以读取所有目录中的所有文件。