当前位置: 首页 > 知识库问答 >
问题:

如何在Android设备的本地终端模拟器中运行"adb shell"命令?

彭宏深
2023-03-14

从我电脑上的shell中,我可以运行adb shell cmd package list packages,并获得所有已安装软件包的列表。我想在我的Android手机(Nexus 6P)上的终端模拟器(目前使用Termux)上本地运行这个和类似的命令。

如果我用/system/bin/sh打开同一个shell,然后尝试运行/system/bin/cmd包列表包,什么都不会发生(没有错误,只是什么都不输出并重新加载提示)。

如果我运行/system/bin/cmd-l,选项列表将按预期显示。$PATH$LD_LIBRARY_PATH在两个环境中是相同的。一个主要的区别是echo$USERadb shell返回shell,但从Termux启动的/system/bin/sh返回本地用户名。

有没有办法在Android本地终端仿真器中复制从adb shell运行的命令的行为?

编辑:我的设备是根设备,我可以使用仅根设备解决方案。

共有3个答案

鞠自明
2023-03-14

所以我最近试过这个。。。如果你是根用户,你可以使用终端模拟器。

  • 苏丽
  • 然后是不包含“adb shell”部分的命令

我尝试了命令“adb shell dumpsys deviceidle force idle”,以强制设备进入Hibernate状态。我通过终端模拟器在设备上这样做:“dumpsys deviceidle force idle”,它确实生效了。dumpsys batterystats命令也起作用。

使用具有大量文本输出的命令时要小心,因为屏幕上会充斥着输出,并且会有一段时间没有响应。

巫马瀚漠
2023-03-14

我手边没有根牛轧糖装置,但下面类似的东西可能与adb shell非常接近(假设您使用的是SuperSU):

env -i USER=shell "$(PATH=/system/xbin:/system/bin:/su/bin:/sbin:/magisk/.core/bin which su)" shell --context u:r:shell:s0 --shell /system/bin/sh --command COMMAND

我(非常简短地)在一个植根Marshmallow设备上从Termux测试了它。

详细说明:

  • -i标志用于从空环境开始

另一种选择是从设备实际运行adb,通过TCP连接到自身。如果您需要一些只能通过adb提供的功能(例如,在我的案例中,它是adb forward),那么这可能是您唯一的选择。不幸的是,这不是特别方便。

我无法在任何公开可用的adb二进制文件中找到成功,所以我自己构建了它,只做了一些小改动。您可以分别看到我在https://github.com/shakalaca/fastboot-adb-android和https://github.com/brbsix/fastboot-adb-android使用的源和所做的更改。

安装adb后,以下是我用于连接设备的命令的简短列表:

# Add iptables rules to block external connections to port 9999'
su root iptables -N adbd
su root iptables -A adbd -i lo -p tcp -m tcp --dport 9999 -j ACCEPT
su root iptables -A adbd -p tcp -m tcp --dport 9999 -j DROP
su root iptables -A INPUT -j adbd

# Necessary in order to display authorization prompt
su shell setprop ro.debuggable 1

su shell setprop service.adb.tcp.port 9999

su root start adbd

adb connect 127.0.0.1:9999

adb wait-for-local-device

要关闭:

adb kill-server
su root stop adbd
su shell setprop ro.debuggable 0
su shell setprop service.adb.tcp.port 0
su root iptables -D INPUT -j adbd
su root iptables -F adbd
su root iptables -X adbd
须新
2023-03-14

问题是Termux。根据设计,Termux只运行(或大部分?)Linux命令行程序,您可以使用apt或更新的“本地”包管理接口从Termux内部安装,例如apt安装bsdtar。运行adb shell命令需要的是一个终端模拟器,它可以真正访问底层Android文件系统,而不仅仅是Termux,它实际上是一个chroot,除非它意识到它没有从文件系统根运行命令 /.

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

    which ls

它应该返回类似于/system/bin/ls的内容。但是如果它返回类似于/data/data/com.termux/files/usr/bin/applets/ls的内容,那么您必须将终端模拟器更改为其他内容。我怀疑Termux的设计是为了考虑谷歌在KitKat或Android4之后实施的更严格的shell执行策略。X.

我正在使用的Android发行版,LineageOS 14.1,带有内置的shell模拟器,允许我运行 /system/bin/ls.中找到的命令

 类似资料:
  • 从PC上的shell中,我可以运行,获得所有已安装软件包的列表。我想在我的Android手机(Nexus 6P)的终端模拟器(目前使用Termux)中本地运行这个和类似的命令。 如果我用打开同一个shell,然后尝试运行,则不会发生任何情况(没有错误,只输出任何内容并重新加载提示)。 如果运行,选项列表将按预期显示。和在这两种环境中是相同的。一个主要区别是从返回“shell”,但从Termux启动

  • 这个应用程序有多个环境,其中这是托管,如,qa,UAT,生产。我可以通过一个屏幕改变环境,只有在摇动一个真正的设备后才来。 不幸的是,Android Studio3没有给出一个直接摇晃设备的选项。如何在模拟器中实现此抖动动作?

  • 理想情况下,我希望能够创建一个像.azcli这样的脚本,我可以在CosmosDB模拟器上本地运行,然后在我的devops管道中使用相同的脚本将资源上传到Azure。 这是我当前的 CLI 命令。 deploy-cosmos.azcli 我在Azure CLI文档中找不到任何提及CosmosDB模拟器的内容,并且CLI命令本身的参数似乎都无法直接指向模拟器。 https://docs.microso

  • 我正在运行最新版本的Mac OS,我想通过命令行工具运行android模拟器。我在Mac终端上运行了以下命令,得到了以下错误。 我还使用以下可用选项运行命令,这些选项也可以在官方文档developer.android.com上找到 我需要做什么,这样我就不需要每次都打开Android Studio而只打开模拟器。

  • 问题内容: 如何通过android app向终端发送命令并获取输出?例如,发送“ ls /”并获取输出以在GUI中将其打印出来? 问题答案: 您必须使用反射来调用android.os.Exec.createSubprocess():

  • 问题内容: 我想用swift替换我的CI bash脚本。我不知道如何调用普通的终端命令,例如或 问题答案: 如果您不使用Swift代码中的命令输出,则只需执行以下操作: 更新:对于Swift3 / Xcode8