Come posso eseguire tutti i possibili comandi di Unix (shell) in android in modo programmato?

Ho questo file .php che invia i comandi alla mia applicazione Android:

immettere qui la descrizione dell'immagine

  • startActivityForResult non funziona correttamente con singoloInstance launchMode
  • ActionBar Compat non mostra il menu a discesa
  • Imansible recuperare l'email da Contatti
  • Come eliminare gli account utente (Gmail, Facebook) Info e dati salvati in programmazione Android?
  • Come passare il valore di avanzamento dal thread all'attività?
  • Riciclare le viste in una list, vale la pena?
  • Ho provato a lavorare con:

    Runtime.getRuntime().exec(commandLine); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream())); 

    ma i comandi echo, pwd e alcuni altri non funzionano.

    Ho la seguente exception:

     java.io.IOException: Error running exec(). Command: [pwd] Working Directory: null Environment: null 

    Per quanto capisco questo è perché non esiste alcun ambiente shell.

    Poi ho provato a scrivere in un file .sh il command che voglio e quindi eseguire il command in questo modo:

     Runtime rt = Runtime.getRuntime(); Process proc = rt.exec("sh /runCmds/shTest.sh"); InputStream is = proc.getInputStream(); 

    e ha risolto il problema con pwd, echo e la maggior parte dei comandi.

    Ma più tardi ho capito che voglio mantenere lo stato dei comandi da eseguire. Ad esempio voglio cambiare directory ( cd data ) e eseguire il command mkdir Apoel

    Ed ecco quando affronto il mio problema. Cosa fare?

    Mi è venuta un'altra idea:

    Effettuare uno script di shell (.sh) e each volta che l'utente desidera eseguire un command appendere il nuovo command in esso (e eseguire nuovamente lo script fori (.sh)). Ma penso che non sia un ottimo modo per farlo!

    C'è un modo semplice per esso? Può la mia applicazione aprire facilmente un terminal?

    Ecco un codice che ho trovato per un Terminal Emulator, ma è troppo complicato!

    https://github.com/jackpal/Android-Terminal-Emulator

  • Modificare il colore di background della scheda e rimuovere la row di divisione tra le tabs
  • Ottenere un NullPointerException con AppCompat
  • Android L - Riproduce l'effetto Ripple sulla vista
  • Android Proguard java.io.IOException: Imansible leggere [proguard.ClassPathEntry
  • come mostrare luoghi vicini come atm, ospedali in android google map?
  • Qual è la definizione di addormentato per un dispositivo android?
  • 2 Solutions collect form web for “Come posso eseguire tutti i possibili comandi di Unix (shell) in android in modo programmato?”

    Una shell intertriggers è quella che rimane in esecuzione, in attesa di nuovi comandi che riceve da stdin, producendo l'output di stdout e stderr. Di conseguenza, l'ambiente che include tutte le modifiche viene mantenuto per tutta la durata della session. Perché la shell sia utile a un utente, lo stdin, lo stoud, lo stderr devono essere connessi all'utente – tramite la console, una linea seriale o xterm, ecc.

    Su Android, in genere ciò che fai è colbind i tubi corrispondenti a stdin, stdout, stderr per il process di shell che hai creato e li usa per spingere i comandi forniti dal tuo programma java e accettare l'output per il tuo programma per interpretare / display.

    L'idea di creare uno script e di eseguirla functionrebbe solo nel caso in cui tutti i comandi siano inseriti prima che uno di essi venga eseguito.

    In primo luogo, un certo background. Su qualsiasi sistema Posix, nella shell, esistono 2 tipi di comandi:

    1. Comandi interni (pwd, cd, echo)
    2. comandi esterni (ls, cp, mv, talvolta anche eco)

    Tutti i comandi del context di directory (cd, pwd ecc.) Sono comandi implementati all'interno della shell e richiedono quindi che la shell rimanga in esecuzione se le modifiche devono contenere (ad esempio cd /data/local/tmp ).

    D'altra parte, i comandi esterni sono standalone e possono essere eseguiti indipendentemente, ma acquisiscono il loro context di directory dal process principale (nella maggior parte dei casi, la shell).

    Adesso per risolvere il problema. Sì, usando uno script è una buona idea, ma è doloroso implementare, in quanto richiede un sovraccarico di modifica dei file. Tuttavia, è ansible utilizzare la shell per creare uno script in volo e eseguirlo utilizzando l'opzione -c . Per esempio:

     /system/bin/sh -c 'cd /data/local/tmp; touch abc; cp abc def; cd /; rm /data/local/tmp/abc' 

    In estate:

     String sPrefix="/system/bin/sh -c 'cd someplace;"; String sInputCmd=getCommand(); // this is simulating your command input String sPostfix="'"; Runtime rt = Runtime.getRuntime(); Process proc = rt.exec(sPrefix+sInputCmd+sPostfix); // sh -c 'cd someplace; echo do something' InputStream is = proc.getInputStream(); 

    Tuttavia, questo non ci dà la possibilità di impostare un context di directory, quindi dobbiamo simulare questo. È ansible aggiungere contesti di directory utilizzando il metodo Runtime.exec (String, String [] envp, File dir). Con questo abbiamo la possibilità di mantenere il context di directory tra i comandi. Ma come facciamo in realtà? Una soluzione è quella di aggiungere pwd al command e prendere l'ultima row dell'output come nuovo context di directory. così

     String sPath = "/"; // start in root directory String sPrefix = "/system/bin/sh -c 'cd someplace;"; String sInputCmd; // this is simulating your command input String sPostfix = ";echo;pwd'"; Runtime rt = Runtime.getRuntime(); while(!(sInputCmd=getCommand()).equals("")) { File dir= new File(sPath); Process proc = rt.exec(sPrefix+sInputCmd+sPostfix, NULL, dir); InputStream is = proc.getInputStream(); // Do processing on input. sPath= last_line_of_is ; } 

    Infine, l'ultima opzione è quella di integrare uno degli emulatori di terminali in te app.

    [1] http://docs.oracle.com/javase/6/docs/api/java/lang/Runtime.html#exec%28java.lang.String,%20java.lang.String%5B%5D,%20java .io.File% 29

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.