【问题标题】:Why does getRuntime().exec("/system/bin/am") always return "Operation not permitted"?为什么 getRuntime().exec("/system/bin/am") 总是返回“不允许操作”?
【发布时间】:2015-06-13 03:02:00
【问题描述】:

我的面向 Android 5.0 的 Android 应用包含如下代码:

try
{
    Runtime rt = Runtime.getRuntime();
    Process proc = rt.exec("/system/bin/am switch-user 0");
    proc.waitFor();
    proc.destroy();
}
catch (Exception e)
{}

上面最简单的代码总是返回proc.exitValue中的1个,这意味着不允许操作

但是,我通过adb shell查看了/system/bin/am switch-user 0的权限,显示如下:

shell@hammerhead:/system/bin $ ll am
ll am
-rwxr-xr-x root shell 210 2015-03-23 15:10 am

显然,权限表明任何用户都可以执行am

更奇怪的是:我可以成功从adb shell调用am(在无根模式下)。

我还尝试在 root 模式下禁用 SELinux。测试表明setenforce 0对Android 5.0没有影响,也就是说,SELinux是在Android 5.0上强制执行的。我可以毫无错误地调用setenforce 0,但sestatus 仍然显示“SELinux 已启用”。

根本原因是什么?

【问题讨论】:

  • 你知道调用Runtime.exec()(或者最好使用ProcessBuilder)的正确方法吗?
  • @Kayaman,ProcessBuilder 返回相同的错误结果。为了简单起见,我没有提供 ProcessBuilder 版本。
  • 可能是 SELinux 问题,尝试“setenforce 0”,但您需要 root 权限
  • 根本原因是什么?显然root是根本原因... user id 0 == root

标签: java android linux shell permissions


【解决方案1】:

可能是 SELinux 问题,尝试“setenforce 0”,但您需要 root 权限。 还检查 stderr 可能会有所帮助http://pastebin.com/BeRYG1Hi

但是,应用程序不能拥有 root 权限。只能是系统应用,但和root不是一回事。

【讨论】:

  • 我还尝试在 root 模式下禁用 SELinux。测试表明setenforce 0对Android 5.0没有影响,也就是说,SELinux是在Android 5.0上强制执行的。我可以毫无错误地调用setenforce 0,但sestatus 仍然显示“SELinux 已启用”。
  • 我认为问题在于您希望您的应用程序获得 root 权限,除非您找到 hack(听说过有关它的谣言),否则这是不可能的。 SELinux 可以启用但允许。
【解决方案2】:

我在Android L模拟器上做了一些测试,如果你执行/system/bin/am,它返回0;如果你执行/system/bin/am switch-user 0,它返回1。

这意味着您确实有权限执行am,但没有权限在应用程序中执行命令am switch-user 0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-20
    • 2016-01-06
    • 1970-01-01
    • 2021-04-01
    • 2014-07-08
    • 2022-01-04
    • 2017-06-27
    相关资源
    最近更新 更多