如何在 Android 设备本地的终端仿真器中运行“adb shell”命令?

新手上路,请多包涵

从我的 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 $USERadb shell 返回“shell”,但从从 Termux 启动的 /system/bin/sh 返回我的本地用户名。

有什么方法可以在 Android 本地的终端仿真器中复制从 adb shell 运行的命令的行为?

编辑:我的设备已获得 root 权限,我可以使用仅 root 解决方案。

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

阅读 972
1 个回答

问题是 Termux。按照设计,Termux 仅运行(或大部分?)您使用 apt 或较新的“本机”包管理界面从 Termux 中安装的 Linux 命令行程序,例如 apt install bsdtar。运行 adb shell 命令需要的是一个终端仿真器,它可以真正访问底层 Android 文件系统,而不仅仅是实际上是 chroot 的 Termux,因为它知道它不是从文件系统根 / 运行命令。

作为一个简单的测试,运行以下命令:

     which ls

它应该返回类似于 /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 中的命令。

原文由 Need to Eat Breakfast 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题