从我电脑上的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$USER
从adb shell
返回shell,但从Termux启动的/system/bin/sh
返回本地用户名。
有没有办法在Android本地终端仿真器中复制从adb shell运行的命令的行为?
编辑:我的设备是根设备,我可以使用仅根设备解决方案。
所以我最近试过这个。。。如果你是根用户,你可以使用终端模拟器。
我尝试了命令“adb shell dumpsys deviceidle force idle”,以强制设备进入Hibernate状态。我通过终端模拟器在设备上这样做:“dumpsys deviceidle force idle”,它确实生效了。dumpsys batterystats命令也起作用。
使用具有大量文本输出的命令时要小心,因为屏幕上会充斥着输出,并且会有一段时间没有响应。
我手边没有根牛轧糖装置,但下面类似的东西可能与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
问题是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