2011-09-25 13 views
6

Ciao sto sviluppando un'applicazione che mi richiede di eseguire un codice bash C'è un modo in cui posso codificare lo script nella mia app e poi eseguirlo? Per esempio (questo è un esempio molto semplificato)Comando bash di esecuzione Android nell'app

#!/system/bin/sh 
# 

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

Ho il seguente metodo per l'esecuzione di comandi ad un solo linea di bash, ma bisogno di eseguire qualcosa di simile che è su più righe. Anche in questo caso, il codice precedente è un esempio molto semplificato di ciò che sto facendo in realtà deve essere eseguito attraverso uno script e non può essere eseguito tramite java. Voglio anche che sia programmato in modo sicuro So che potrebbe avere lo script memorizzato sul telefono ed eseguirlo con il seguente ma non voglio che lo script appena uscito sia piuttosto codificato nell'app.

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

Grazie per tutto l'aiuto con il mio problema

risposta

8

Se ho capito bene, tutto quello che dovete fare è cambiare il metodo di esempio di una riga a qualcosa che deve accettare e inviare più linee, in questo modo:

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

in questo modo, è possibile chiamare i comandi bash multilinea in questo 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

grazie per il codice andando a dare una prova in pochi minuti spero che funzioni bene :) – user577732

+0

ha funzionato esattamente come volevo il secondo metodo per l'esecuzione sarà molto utile grazie a una tonnellata! – user577732

+0

Sto usando la stessa cosa ma non funziona per me. Funziona davvero per te? Sto usando l'app di sistema. – NovusMobile