有没有办法编写一个脚本,使用 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 许可协议
OP 试图将以下 3 个命令(他在交互式 shell 会话中一个接一个地执行没有问题)组合成一个非交互式命令:
为简单起见,让我们从交互式
adb shell
会话开始。如果我们只是尝试将最后两个命令组合成一行:这将不起作用,因为 shell 重定向的工作方式 - 只有
cat /sdcard/temp_prefs.xml
命令的一部分将运行com.example.app
UID
许多人 “知道” 将命令中围绕重定向的部分放入引号中:
这不起作用,因为
run-as
命令不够智能,无法解析整个命令。它需要一个可执行文件作为下一个参数。正确的方法是使用sh
代替:那么我们是否可以在命令前
adb shell
并完成它?不必要。通过从您的 PC 运行该命令,您还可以添加另一个本地 shell 及其解析器。具体转义要求取决于您的操作系统。在 Linux 或 OSX 中(如果您的命令尚未包含任何'
),很容易像这样对整个命令进行单引号:但有时使用带有(-out 或更少)引号的替代解决方案更容易:
或者,如果您的设备没有
cp
命令: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 ofrun-as
command your current directory is theHOME
dir of your package .