从我的 PC 上的 shell,我可以运行 adb shell cmd package list packages
,并获得所有已安装软件包的列表。我想在我的 Android 手机 (Nexus 6P) 的终端模拟器(目前使用 Termux)中本地运行这个命令和类似的命令。
如果我用 /system/bin/sh
打开同一个 shell,然后尝试运行 /system/bin/cmd package list packages
,什么也没有发生(没有错误,只是什么都不输出并重新加载提示)。
如果我运行 /system/bin/cmd -l
选项列表按预期显示。 $PATH
和 $LD_LIBRARY_PATH
在两种环境中都是相同的。一个主要区别是 echo $USER
从 adb shell
返回“shell”,但从从 Termux 启动的 /system/bin/sh
返回我的本地用户名。
有什么方法可以在 Android 本地的终端仿真器中复制从 adb shell
运行的命令的行为?
编辑:我的设备已获得 root 权限,我可以使用仅 root 解决方案。
原文由 user2571203 发布,翻译遵循 CC BY-SA 4.0 许可协议
问题是 Termux。按照设计,Termux 仅运行(或大部分?)您使用 apt 或较新的“本机”包管理界面从 Termux 中安装的 Linux 命令行程序,例如 apt install bsdtar。运行 adb shell 命令需要的是一个终端仿真器,它可以真正访问底层 Android 文件系统,而不仅仅是实际上是 chroot 的 Termux,因为它知道它不是从文件系统根 / 运行命令。
作为一个简单的测试,运行以下命令:
它应该返回类似于
/system/bin/ls
的内容。但是,如果它返回类似/data/data/com.termux/files/usr/bin/applets/ls
的内容,那么您必须将终端仿真器更改为其他内容。我怀疑 Termux 的设计考虑到了谷歌在 KitKat 或 Android 4.X 之后实施的更严格的 shell 执行策略。我使用的 Android 发行版 LineageOS 14.1 带有一个内置的 shell 模拟器,允许我运行 /system/bin/ls 中的命令。