Rooted Android 7.0设备执行su命令遇error=13权限拒绝问题求助
问题描述
在已Root的Android 7.0设备上,尝试通过应用以root身份执行su root 'whoami'命令验证权限,代码逻辑无语法错误,且通过adb shell su root 'whoami'能正常返回root,但应用内运行时抛出java.io.IOException: Cannot run program "su": error=13, Permission denied异常,即使使用绝对路径/system/xbin/su也无法解决。
可能原因及解决方案
1. Root权限未授予应用
多数Root管理工具(如Magisk、SuperSU)会对每个请求Root权限的应用做授权校验。应用首次调用su时,系统会弹出授权弹窗,若用户未允许或授权被取消,就会触发权限拒绝。
- 处理方式:打开Root管理工具,找到测试应用
me.rapierxbox.test,确认已授予其Root权限。
2. 命令参数格式错误
Runtime.getRuntime().exec()直接传入带空格的命令字符串时,会被错误拆分参数。"su root 'whoami'"会被解析为执行su,参数为root、'whoami',单引号在Android Shell中无法被正确识别。
- 处理方式:改用字符串数组传递命令,避免参数解析问题:
public String runAsRoot() { try { // 用字符串数组传递命令,确保参数被正确解析 String[] cmd = {"su", "-c", "whoami"}; Process process = Runtime.getRuntime().exec(cmd); BufferedReader reader = new BufferedReader( new InputStreamReader(process.getInputStream())); int read; char[] buffer = new char[4096]; StringBuffer output = new StringBuffer(); while ((read = reader.read(buffer)) > 0) { output.append(buffer, 0, read); } reader.close(); process.waitFor(); return output.toString().trim(); } catch (IOException e) { throw new RuntimeException(e); } catch (InterruptedException e) { throw new RuntimeException(e); } }
说明:
su -c用于指定要执行的命令,确保whoami在root环境下被正确执行。
3. SELinux限制
Android 7.0及以上版本默认启用SELinux强制模式,可能阻止应用执行su命令。
- 处理方式:
- 临时关闭SELinux(仅用于测试):通过adb执行
adb shell setenforce 0,重新运行应用测试。 - 永久解决:若使用自定义ROM,可修改SELinux规则;若使用Magisk,确保Magisk已正确挂载并绕过SELinux限制。
- 临时关闭SELinux(仅用于测试):通过adb执行
4. su二进制文件权限问题
即使/system/xbin/su是全局可执行,也可能存在权限设置错误或SELinux上下文限制。
- 处理方式:通过adb检查su文件权限:
adb shell ls -l /system/xbin/su
正常权限应为-rwsr-xr-x(setuid位已设置),若权限不符,执行:
adb shell chmod 6755 /system/xbin/su
同时检查SELinux上下文:
adb shell ls -Z /system/xbin/su
确保上下文为u:object_r:su_exec:s0或其他允许应用执行的合法上下文。
内容的提问来源于stack exchange,提问作者RapierXbox

