Cómo ejecutar múltiples comandos de shell a través de una aplicación en Android

Estoy tratando de ejecutar 3 comandos diferentes a través de mi aplicación, pero solo se está ejecutando el primero. aquí está el código.

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

Obtengo el acceso de root pero después de eso no pasa nada más.

EDITAR: Probé este código pero esto también se ejecuta solo su comand

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();

EDITAR: Esto funciona, pero solo un comando a la vez, tendré que hacer un botón para cada comando.

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();
                     }

preguntado el 27 de agosto de 11 a las 17:08

5 Respuestas

Esto es fácil de hacer.

Utilice "herramientas de raíz".

Agregue el archivo jar desde este enlace: 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();

Respondido 19 Feb 16, 17:02

La raíz no es "pegajosa" porque el truco de su no está destinado (ni en un sistema operativo similar a Unix) capaz de cambiar el ID de usuario de un proceso existente.

Algunas versiones de su le permitirán especificar un comando y sus parámetros a ejecutar. Pero otros no lo harán, y en su lugar requieren que abra el flujo de entrada del shell de superusuario creado por el programa su, y presione comandos en él como si los estuviera escribiendo.

En lugar de proporcionar un ejemplo, sugiero que la pregunta se cierre como un duplicado de una en la que se proporciona el código.

Respondido 27 ago 11, 21:08

¿Tiene un dispositivo rooteado? Si no, esto no funcionará, punto. Si es así, no tiene sentido repetir algo ya resuelto en la pregunta a la que se hace referencia. - Chris Stratton

Tengo un dispositivo rooteado y su funciona, pero otros comandos ni siquiera aparecen en el logcat. - Arveen

Exec ejecuta un comando en un proceso separado, por lo que esperaría que los efectos de "su" se pierdan una vez que finalice ese proceso. Entonces, tal vez el montaje falle, ya que está en un proceso separado, donde no se ha aplicado su.

¿Puede poner su secuencia de comandos en un solo archivo para que se ejecuten?

Alternativamente, ¿puede usar su -c para hacer el trabajo en un comando?

Respondido 27 ago 11, 21:08

¿Puedes decirme cómo usar su -c aquí? - Arveen

¿Puedes usar un shell && para combinar mount y cp en un solo comando? - djna

fácil con un &

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

Respondido el 22 de diciembre de 15 a las 19:12

perdón por la respuesta tardía. Puedo ejecutar varios comandos a través de mi aplicación. y estoy seguro de que también puede ejecutar varios comandos en el dispositivo raíz.

aquí está mi código:

  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();
                }

ahora en el código anterior i primero verifique el acceso a la raíz luego tomar una captura de pantalla del enfoque actual de la pantalla y colocarla en el almacenamiento interno luego ejecutar adb shell para ejecutar un comando adicional luego Aumento el brillo.

NOTA: Debe poner el carácter de nueva línea "\ n" al final de cada comando.

.

Espero que esto también te sea útil.

Respondido 15 Abr '18, 13:04

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.