从priv-app应用程序运行shell命令

7
我正在尝试从我添加到AOSP(7.1.1)的system/priv-app中运行shell命令。我想要运行的命令是: ip link add dev can0 type can,以打开CAN总线。我已经将镜像构建为-eng-userdebug版本。在adb shell中运行命令正常执行,并成功打开了CAN总线。但是,我的问题是我会收到以下错误:

Cannot run program "su": error=13, Permission denied

当我在系统特权java应用程序中尝试以下代码时。
//ArrayList<String> commands is passed into the method
try {
  if (null != commands && commands.size() > 0) {
     Process suProcess = Runtime.getRuntime().exec("su");
     DataOutputStream os = new DataOutputStream(suProcess.getOutputStream());
     for (String currCommand : commands) {
        os.writeBytes(currCommand + "\n");
        os.flush();
     }
     os.writeBytes("exit\n");
     os.flush();
     BufferedReader stderr = new BufferedReader(new InputStreamReader(suProcess.getErrorStream()));
     String line = "";
     String errString = "";
     while ((line = stderr.readLine()) != null) errString += line + "\n";
     suProcess.waitFor();
     if (suProcess.exitValue() != 0)
        throw new Exception(errString);
 } //Handle exception

“ls -l /system/xbin/su”的输出是什么? - Onik
-rwsr-x--- 1 root shell 18000 2017-09-25 07:55 /system/xbin/su。我已经试图在init.rc中使用chmod为该文件提供用户执行权限,但似乎也无法起作用。 - Aaron Thompson
所以su是由rootshell拥有的。你的应用程序属于system组,没有执行它的权限... 我会尝试以下几个方法:1) 进入shell,获取su并将二进制文件设置为全局可执行(可能需要使用adb remount重新挂载/system为读写权限);2) 如果可以接受的话,安装SuperSU或其他替代品来获得通过它们授予su的权限;3) 暂时想不到其他方法 :) - Onik
请查看 https://dev59.com/RKTja4cB1Zd3GeqPHtLT#46018625 - 这可能是由于SE强制执行状态而阻止了对su的访问。 - Mixaz
1个回答

0
你可以尝试用这种方式实现:
Process mProcess = new ProcessBuilder()
                       .command("/system/xbin/su")
                       .redirectErrorStream(true).start();

DataOutputStream out = new DataOutputStream(mProcess.getOutputStream());

谢谢您的回复,但是我使用这种方法仍然收到相同的错误信息:“D ERR: Cannot run program "/system/xbin/su": error=13, Permission denied”。 - Aaron Thompson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接