2011-09-25 17 views
6

Hola, estoy desarrollando una aplicación que requiere que ejecute código bash. ¿Hay alguna forma de codificar el script en mi aplicación y luego ejecutarlo? Por ejemplo (este es un ejemplo muy simplificado)Android run bash command en la aplicación

#!/system/bin/sh 
# 

if [ ! -f /sdcard/hello.txt ] 
then 
echo 'Hello World' >> /sdcard/hello.txt 
else 
echo 'Goodbye World' >> /sdcard/goodbye.txt 
fi 

tengo el siguiente método para el funcionamiento de una línea de comandos de bash pero necesito para ejecutar algo como eso que está en varias líneas. Una vez más, el código anterior es un ejemplo muy simplificado de lo que estoy haciendo en realidad se debe ejecutar a través de un script y no se puede hacer a través de Java. También quiero tenerlo codificado. Sé que podría tener el guión almacenado en el teléfono y ejecutarlo con lo siguiente, pero no quiero que el guión esté allí codificado en la aplicación.

public Boolean execCommand(String command) 
    { 
     try { 
      Runtime rt = Runtime.getRuntime(); 
      Process process = rt.exec("su"); 
      DataOutputStream os = new DataOutputStream(process.getOutputStream()); 
      os.writeBytes(command + "\n"); 
      os.flush(); 
      os.writeBytes("exit\n"); 
      os.flush(); 
      process.waitFor(); 
     } catch (IOException e) { 
      return false; 
     } catch (InterruptedException e) { 
      return false; 
     } 
     return true; 
    } 

Gracias por cualquier ayuda con mi problema

Respuesta

8

Si he entendido bien, todo lo que tiene que hacer es cambiar el método de ejemplo, una línea a algo que debe aceptar y enviar múltiples líneas, así:

public Boolean execCommands(String... command) { 
    try { 
     Runtime rt = Runtime.getRuntime(); 
     Process process = rt.exec("su"); 
     DataOutputStream os = new DataOutputStream(process.getOutputStream()); 

     for(int i = 0; i < command.length; i++) { 
      os.writeBytes(command[i] + "\n"); 
      os.flush(); 
     } 
     os.writeBytes("exit\n"); 
     os.flush(); 
     process.waitFor(); 
    } catch (IOException e) { 
     return false; 
    } catch (InterruptedException e) { 
     return false; 
    } 
    return true; 
} 

de esa manera, puede llamar a sus comandos de bash varias líneas de este modo:

String[] commands = { 
      "echo 'test' >> /sdcard/test1.txt", 
      "echo 'test2' >>/sdcard/test1.txt" 
    }; 

    execCommands(commands); 

    String commandText = "echo 'foo' >> /sdcard/foo.txt\necho 'bar' >> /sdcard/foo.txt"; 

    execCommands(commandText.split("\n")); 
+0

gracias por el código voy a intentar esto en unos minutos espero que funcione bien :) – user577732

+0

funcionó exactamente como yo quería que el segundo método para ejecutarlo sea muy útil gracias ¡muchísimo! – user577732

+0

Estoy usando lo mismo pero no funciona para mí. ¿Realmente está funcionando para usted? Estoy usando la aplicación del sistema. – NovusMobile