是否可以在只安装 su 二进制文件且未安装 SuperSU 或 Superuser apk 的情况下以 root 身份运行 shell 命令?
Posted
技术标签:
【中文标题】是否可以在只安装 su 二进制文件且未安装 SuperSU 或 Superuser apk 的情况下以 root 身份运行 shell 命令?【英文标题】:Is it possible to run a shell command as root with only the su binary and no SuperSU or Superuser apk installed? 【发布时间】:2012-12-28 04:54:50 【问题描述】:我有一部只安装了 su 二进制文件的 android 手机,它可以工作,这意味着我可以将 shell 插入手机并运行“su”命令,我将成为 root。
当我尝试通过代码运行命令时,无论我尝试哪种方式运行它似乎都不起作用。我尝试了以下命令的许多不同变体。
Runtime.getRuntime().exec("su -c ps");
当我在另一部安装了 Superuser.apk 或 SuperSU.apk 应用程序的 root 手机上运行此命令时,我收到一个对话框,询问我是否要允许它以 root 权限运行。当 apk 不存在时,它永远不会询问,并且命令永远不会起作用。
我尝试在第一部手机上安装 apk,但它们似乎没有做任何事情。所以,正如最初的问题所问的那样——>有没有办法在没有安装 SU 应用程序的情况下从应用程序内运行提升的命令?
【问题讨论】:
如果不知道安装了 哪个 su 二进制文件,这基本上是无法回答的 - 如果它是库存的 android 二进制文件,则 应用程序 无法使用它所有,在任何情况下。 请查看:***.com/questions/17615412/… 【参考方案1】:这可能是因为您需要将命令作为参数传递给su
,如下所示:su -c 'ls -l'
或者您可能需要指定su
的完整路径,但我不明白为什么它不能按照您的方式工作:
Runtime.exec("/system/bin/su -c ps")
或者也许Runtime.exec("/system/bin/su -c \'ps\'")
也尝试检查此命令的输出:System.getenv("PATH")
另一个变体可能是Runtime.exec("su -c \'ls -s \'")
确保不要忘记转义单引号,因为它们是实际 String
的一部分。
这是我发现工作最一致的方式,它也适用于未安装 Superuser 或 SuperSU 的设备,因为这些应用程序仅侦听应用程序尝试运行时发出的广播一个命令作为根。 @Boardy SuperSU 和 Superuser 拦截广播,因此充当应用程序和 root 权限之间的中间人,但它对于 root 设备不是必需的。如果您想对以 root 身份运行命令的应用程序有更多控制权,这是必要的,但即便如此,它仍然只限制您决定哪些应用程序,而不是哪些命令,被授予 root 权限。
此外,您可能想看看 RootTools,更具体地说,是 RootTools.isAccessGiven()
命令,它为您的应用请求 root 权限。
来源:Launch a script as root through ADB
【讨论】:
我已经完成了这里列出的大部分建议。我将尝试 System.getenv 并尝试单引号(这是一个很好的建议,我因为没有早点尝试而自责!)。我可以说的一件事是我确实尝试了 RootTools,当我调用 isAccessGiven() 时它返回 false,但是当我调用 isRootAvailable() 时它显示为 true,所以它可能不像添加单引号那么简单。现在唯一的问题是我目前无法访问该设备,因此需要一些时间来测试它。感谢您的建议!【参考方案2】:并非所有适用于 Android 的“su”版本都接受从命令行参数执行的命令。
如果他们不这样做,您将需要让 'su' 启动一个特权 shell,获取其输入文件描述符,并将命令通过管道传输到其中。这已在 *** 上多次介绍。
【讨论】:
能否请您指出 *** 上的一个此类示例。我需要一个工作示例。 任何认真的搜索都会找到它们。但现在这有点离题了,因为自从切换到 SELinux 以来,这对于几个 Android 版本都无法使用,这需要更多涉及的解决方法,除非您有自定义或工程构建没有它。【参考方案3】:我相信您需要安装 SU 应用程序,因为它们为用户提供了是否应允许以 root 身份运行该应用程序的问题。
【讨论】:
您知道这些应用程序的作用或工作原理吗?这是我可以从我自己的代码中提供的对话框吗?我问的原因是我在手机上尝试了这两个应用程序,但都没有像我预期的那样弹出对话框。 @brianestey 不幸的是,我不知道它们是如何工作的。但如果设备已正确植根,则 SU 或 SuperSU 应用程序应弹出请求以 root 身份运行的权限。您是否使用 Google 已包含多用户支持的 JellyBean 4.2。我注意到自从 Google 推出此功能以来,我使用的几个根应用程序不再工作。如果您同时安装了这两个应用程序,则可能会导致冲突,但不确定 不,这不是答案。完全有可能(如果有风险)拥有一个没有链接用户对话应用程序的简单“su”,这样效果就是“总是允许”。当然,如果没有它,打算与此类应用程序一起使用的“su”二进制文件可能无法工作。【参考方案4】:你应该能够做到这一点。
试试:
adb root shell ls -l
【讨论】:
你能扩展这个答案吗?就目前而言,它不是一个高质量的答案,并且有被否决或删除的风险。以上是关于是否可以在只安装 su 二进制文件且未安装 SuperSU 或 Superuser apk 的情况下以 root 身份运行 shell 命令?的主要内容,如果未能解决你的问题,请参考以下文章