如何通过android中的应用程序运行多个shell命令

时间:2011-08-27 17:12:36

标签: android linux

我试图通过我的应用程序运行3个不同的命令,但只有第一个命令正在执行。 这是代码。

Process process = Runtime.getRuntime().exec("su");
process = Runtime.getRuntime().exec("mount -o remount,rw /system");
process = Runtime.getRuntime().exec("cp /sdcard/hosts /system/etc");

我获得root访问权限,但之后没有其他任何事情发生。

编辑:我尝试了这段代码,但这也只执行了su cmand

String[] commands = {"mount -o remount,rw /system", "cp /sdcard/hosts /system/etc"};

                        Process p = Runtime.getRuntime().exec("su");
                        DataOutputStream os = new DataOutputStream(p.getOutputStream());            
                        for (String tmpCmd : commands) {
                                os.writeBytes(tmpCmd+"\n");
                        }           
                        os.writeBytes("exit\n");  
                        os.flush();

编辑:这有效,但只有一个命令,我将不得不为每个命令创建一个按钮。

String[] hin1 = { "su", "-c","cp /sdcard/Mediafire/hosts /system/etc/" };
                     try {
                         Runtime.getRuntime().exec(hin1);
                     } catch (IOException e) {
                         // TODO Auto-generated catch block
                         e.printStackTrace();
                     }

5 个答案:

答案 0 :(得分:3)

这很容易做到。

使用“root工具”。

从此链接添加jar文件: https://github.com/Stericson/RootTools

Command command = new Command(0, "echo this is a command", "echo this is another command"){
        @Override
        public void output(int id, String line)
        {
            //Do something with the output here
        }
};
RootTools.getShell(true).add(command).waitForFinish();

答案 1 :(得分:2)

Root不是“粘性”,因为su hack既不打算(也不是类似unix的操作系统)能够更改现有进程的用户ID。

某些版本的su将允许您指定要执行的命令及其参数。但是其他人不会,而是要求你打开su程序创建的超级用户shell的输入流,并将命令推入其中,就像你输入它们一样。

不是提供一个例子,我建议将问题作为提供代码的副本关闭。

答案 2 :(得分:1)

Exec在一个单独的进程中运行一个命令,所以我希望一旦该进程完成就会丢失“su”的效果。因此,mount可能会失败,因为它处于一个单独的进程中,而su尚未应用。

你能把你的命令序列放在一个要执行的文件中吗?

或者你可以使用su -c在一个命令中完成工作吗?

答案 3 :(得分:1)

轻松使用&

Process process = Runtime.getRuntime().exec("su & mount -o remount,rw /system");

答案 4 :(得分:0)

抱歉迟到了。 我可以通过我的应用程序运行多个命令。我相信你也能在root设备上运行多个命令。

这是我的代码:

  try {
                    //below code for getting root access.
                Process processcmd = Runtime.getRuntime().exec("su");
                    OutputStream os = processcmd.getOutputStream();
                    //below code for capture screenshot and placed in internal storage.
                    os.write("screencap sdcard/my.png\n".getBytes());
                    // below code for execute shell commands
                    os.write("adb shell\n".getBytes());
                    //below code for increase brightness.
                    os.write("input keyevent 221\n".getBytes());
                    os.write("input keyevent 221\n".getBytes());
                    os.write("input keyevent 221\n".getBytes());
                    os.write("input keyevent 221\n".getBytes());
                    os.write("input keyevent 221\n".getBytes());
                    os.write("input keyevent 221\n".getBytes());
                    os.write("input keyevent 221\n".getBytes());
                    os.write("input keyevent 221\n".getBytes());
                    os.write("input keyevent 221\n".getBytes());
                    os.write("input keyevent 221\n".getBytes());

                    //below code for decreasing brightness.
                    os.write("input keyevent 220\n".getBytes());
                    os.write("input keyevent 220\n".getBytes());
                    os.write("input keyevent 220\n".getBytes());
                    os.write("input keyevent 220\n".getBytes());
                    os.write("input keyevent 220\n".getBytes());
                    os.write("input keyevent 220\n".getBytes());
                    os.write("input keyevent 220\n".getBytes());
                    os.write("input keyevent 220\n".getBytes());
                    os.write("input keyevent 220\n".getBytes());
                    os.write("input keyevent 220\n".getBytes());

                    os.flush();
                } catch (IOException e) {
                    e.printStackTrace();
                }

现在在上面的代码中我首先检查根访问然后获取当前屏幕焦点的屏幕截图并将其放入内部存储然后执行adb shell以执行额外命令然后我增加亮度。

  

注意:您必须添加换行符#34; \ n"在每个命令结束时。

希望这对你也有帮助。