首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用run-as复制ADB shell中的文件

使用run-as复制ADB shell中的文件
EN

Stack Overflow用户
提问于 2014-03-28 10:45:42
回答 3查看 32.1K关注 0票数 13

有没有办法编写一个脚本,使用run-as从ADB shell复制文件?

我所知道的在adb shell中复制的唯一方法是使用cat source > dest (编辑:现代安卓版本有cp命令,这使得这个问题没有必要),但我只能引用大于一个级别的符号,所以我的脚本可以将它传递给adb shell,但不能传递给adb shell run-as。

例如,这是可行的:

adb shell "cat source > dest"

但这不是:

adb shell run-as "cat source > dest"

也不是这样:

adb shell "run-as cat source \> dest"

我甚至尝试创建了一个小脚本并将其上传到设备上,但我似乎无法从adb shell运行该脚本-它告诉我“权限被拒绝”。我也不能修改脚本。

我这样做的原因是要将文件复制到应用程序的私有存储区-具体地说,我使用脚本修改共享首选项,并将修改后的首选项放回原处。但是,只有应用程序本身或root用户可以写入我想要的文件。

此场景中的用例是将文件复制到设备上的受保护位置,而不是检索它;对于检索,this question中已经有了很好的答案。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-12-06 05:24:32

OP尝试将以下3个命令(他在交互式shell会话中一个接一个地执行都没有问题)组合成一个非交互式命令:

代码语言:javascript
运行
复制
adb shell
run-as com.example.app
cat /sdcard/temp_prefs.xml > shared_prefs/com.example.app_preferences.xml

为简单起见,让我们从一个交互式adb shell会话开始。如果我们只是尝试将最后两个命令合并到一行中:

代码语言:javascript
运行
复制
run-as com.example.app cat /sdcard/temp_prefs.xml > shared_prefs/com.example.app_preferences.xml

由于外壳重定向的工作方式,这将不起作用-只有命令的cat /sdcard/temp_prefs.xml部分将与com.example.app UID一起运行

许多人“知道”将命令中关于重定向的部分放在引号中:

代码语言:javascript
运行
复制
run-as com.example.app "cat /sdcard/temp_prefs.xml > shared_prefs/com.example.app_preferences.xml"

这不起作用,因为run-as命令不够智能,无法解析整个命令。它期望一个可执行文件作为下一个参数。正确的方法应该是使用sh

代码语言:javascript
运行
复制
run-as com.example.app sh -c "cat /sdcard/temp_prefs.xml > shared_prefs/com.example.app_preferences.xml"

所以我们能不能只在命令前面加上adb shell,然后就可以完成它了?不一定。通过从您的PC运行该命令,您还可以添加另一个本地shell及其解析器。特定的转义要求取决于您的操作系统。在Linux或OSX中(如果您的命令尚未包含任何'),很容易将整个命令用单引号引起来,如下所示:

代码语言:javascript
运行
复制
adb shell 'run-as com.example.app sh -c "cat /sdcard/temp_prefs.xml > shared_prefs/com.example.app_preferences.xml"'

但有时使用带有(-out或更少)引号的替代解决方案会更容易:

代码语言:javascript
运行
复制
adb shell run-as com.example.app cp /sdcard/temp_prefs.xml shared_prefs/com.example.app_preferences.xml

或者,如果您的设备没有cp命令:

代码语言:javascript
运行
复制
adb shell run-as com.example.app dd if=/sdcard/temp_prefs.xml of=shared_prefs/com.example.app_preferences.xml

还要注意我是如何使用shared_prefs/com.example.app_preferences.xml而不是完整的/data/data/com.example.app/shared_prefs/com.example.app_preferences.xml的--通常在run-as命令中,您的当前目录是包的HOME目录。

票数 18
EN

Stack Overflow用户

发布于 2014-03-31 08:47:23

遵循Chris Stratton的建议,我最终让它工作的方式如下(用于将共享首选项复制回设备):

代码语言:javascript
运行
复制
adb push shared_prefs.xml /sdcard/temp_prefs.xml
cat <<EOF | adb shell
run-as com.example.app
cat /sdcard/temp_prefs.xml > /data/data/com.example.app/shared_prefs/com.example.app_preferences.xml
exit
exit
EOF

直接到adb shell run-as的管道不起作用,我不知道为什么,但是到adb shell的管道起作用了。诀窍是从交互式shell调用run-as,然后它继续接受来自管道的输入。

HERE文档允许我轻松地将换行符嵌入到不同的命令中,通常只是使其具有可读性;我使用分号不是很幸运,但这可能是由于我的处理方式所致。我相信它可以与其他通过管道传输多个命令/换行符的方法一起工作;当我最终让它工作时,我停止了这个实验。

两个出口对于防止挂起的shell (可以用CTRL-C组合键杀死)是必要的;一个出口用于run-as,另一个出口用于adb shell本身。看起来,Adb的shell对文件末尾的响应不是很好。

票数 12
EN

Stack Overflow用户

发布于 2016-01-06 09:24:31

您只需更改目录的权限,然后将所有文件拉出。但对我来说,我只寻找一个共享的首选项文件,我能够像这样获得数据:

代码语言:javascript
运行
复制
PACKAGE='com.mypackage.cool'
SHAREDPREF_FILE="${PACKAGE}_preferences.xml"

    adb shell "run-as $PACKAGE cat /data/data/$PACKAGE/shared_prefs/$SHAREDPREF_FILE">$SHAREDPREF_FILE

现在,我们将共享首选项文件的数据存储在一个同名的文件中。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22703254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档