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

新手上路,请多包涵

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

我知道在 adb shell 中复制的唯一方法是使用 cat source > dest (编辑:现代 android 版本有 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 运行该脚本 - 它告诉我“权限被拒绝”。我也不能 chmod 脚本。

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

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

原文由 Logan Pickup 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

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

 adb shell
run-as com.example.app
cat /sdcard/temp_prefs.xml > shared_prefs/com.example.app_preferences.xml

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

 run-as com.example.app cat /sdcard/temp_prefs.xml > shared_prefs/com.example.app_preferences.xml

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

许多人 “知道” 将命令中围绕重定向的部分放入引号中:

 run-as com.example.app "cat /sdcard/temp_prefs.xml > shared_prefs/com.example.app_preferences.xml"

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

 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 中(如果您的命令尚未包含任何 ' ),很容易像这样对整个命令进行单引号:

 adb shell 'run-as com.example.app sh -c "cat /sdcard/temp_prefs.xml > shared_prefs/com.example.app_preferences.xml"'

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

 adb shell run-as com.example.app cp /sdcard/temp_prefs.xml shared_prefs/com.example.app_preferences.xml

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

 adb shell run-as com.example.app dd if=/sdcard/temp_prefs.xml of=shared_prefs/com.example.app_preferences.xml

Also notice how I used shared_prefs/com.example.app_preferences.xml instead of full /data/data/com.example.app/shared_prefs/com.example.app_preferences.xml - normally inside of run-as command your current directory is the HOME dir of your package .

原文由 Alex P. 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

 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 文档让我可以轻松地将换行符嵌入到单独的命令中,并且通常只是使其可读;我在分号方面运气不佳,但这可能是因为我做事的方式。我相信它可能与其他管道多命令/换行符的方法一起使用;一旦我终于让它工作,我就停止了实验。

这两个出口是防止挂壳所必需的(可以用 CTRL-C 杀死);一个用于 run-as ,另一个用于 adb shell 本身。 Adb 的 shell 似乎不能很好地响应文件结束。

原文由 Logan Pickup 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题