web-dev-qa-db-fra.com

Télécharger le catalogue Shell d'Android

Liste des questions à la fin du processus de mise en œuvre de la mise en forme de la mise en forme (dans la version Google Play) dans l'application de recherche sue premoenter, quindi scrivi:

screenrecord --time-limit 10 /sdcard/MyVideo.mp4

e premere di nuovoenterCliquez ici pour en savoir plus sur les fonctionnalités du kit Android KitKat.

cliquez sur le lien suivant pour afficher le code de la page de code ci-dessous.

Process su = Runtime.getRuntime().exec("su");
Process execute = Runtime.getRuntime().exec("screenrecord --time-limit 10 /sdcard/MyVideo.mp4");

Ma non-lecture est effectuée dans un fichier non créé. Oui, vous pouvez télécharger une application enracinée dans le Kit Android installé. dov'è il problema? venir posso risolvere? perche da emulatore di terminale funziona e in Java no?

36
Giovanni Mariotti

Vous devez saisir l'entrée standard du processus su qui vient d'être lancé et y écrire la commande, sinon vous exécutez les commandes avec la UID actuelle.

Essayez quelque chose comme ça:

try{
    Process su = Runtime.getRuntime().exec("su");
    DataOutputStream outputStream = new DataOutputStream(su.getOutputStream());

    outputStream.writeBytes("screenrecord --time-limit 10 /sdcard/MyVideo.mp4\n");
    outputStream.flush();

    outputStream.writeBytes("exit\n");
    outputStream.flush();
    su.waitFor();
}catch(IOException e){
    throw new Exception(e);
}catch(InterruptedException e){
    throw new Exception(e);
}
62
Carlo Cannas

Une modification du code par @CarloCannas:

public static void Sudo(String...strings) {
    try{
        Process su = Runtime.getRuntime().exec("su");
        DataOutputStream outputStream = new DataOutputStream(su.getOutputStream());

        for (String s : strings) {
            outputStream.writeBytes(s+"\n");
            outputStream.flush();
        }

        outputStream.writeBytes("exit\n");
        outputStream.flush();
        try {
            su.waitFor();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        outputStream.close();
    }catch(IOException e){
        e.printStackTrace();
    }
}

(Nous vous invitons à trouver un meilleur endroit pour outputStream.close ())

Exemple d'utilisation:

private static void suMkdirs(String path) {
    if (!new File(path).isDirectory()) {
        Sudo("mkdir -p "+path);
    }
}

Update: Pour obtenir le résultat (la sortie sur stdout), utilisez:

public static String sudoForResult(String...strings) {
    String res = "";
    DataOutputStream outputStream = null;
    InputStream response = null;
    try{
        Process su = Runtime.getRuntime().exec("su");
        outputStream = new DataOutputStream(su.getOutputStream());
        response = su.getInputStream();

        for (String s : strings) {
            outputStream.writeBytes(s+"\n");
            outputStream.flush();
        }

        outputStream.writeBytes("exit\n");
        outputStream.flush();
        try {
            su.waitFor();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        res = readFully(response);
    } catch (IOException e){
        e.printStackTrace();
    } finally {
        Closer.closeSilently(outputStream, response);
    }
    return res;
}
public static String readFully(InputStream is) throws IOException {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    byte[] buffer = new byte[1024];
    int length = 0;
    while ((length = is.read(buffer)) != -1) {
        baos.write(buffer, 0, length);
    }
    return baos.toString("UTF-8");
}

L'utilitaire permettant de fermer en silence un certain nombre d'éléments fermables ( SoSket for be no Closeable ) est

public class Closer {
// closeAll()
public static void closeSilently(Object... xs) {
    // Note: on Android API levels prior to 19 Socket does not implement Closeable
    for (Object x : xs) {
        if (x != null) {
            try {
                Log.d("closing: "+x);
                if (x instanceof Closeable) {
                    ((Closeable)x).close();
                } else if (x instanceof Socket) {
                    ((Socket)x).close();
                } else if (x instanceof DatagramSocket) {
                    ((DatagramSocket)x).close();
                } else {
                    Log.d("cannot close: "+x);
                    throw new RuntimeException("cannot close "+x);
                }
            } catch (Throwable e) {
                Log.x(e);
            }
        }
    }
}
}
26
Process p;
StringBuffer output = new StringBuffer();
try {
    p = Runtime.getRuntime().exec(params[0]);
    BufferedReader reader = new BufferedReader(
            new InputStreamReader(p.getInputStream()));
    String line = "";
    while ((line = reader.readLine()) != null) {
        output.append(line + "\n");
        p.waitFor();
    }
} 
catch (IOException e) {
    e.printStackTrace();
} catch (InterruptedException e) {
    e.printStackTrace();
}
String response = output.toString();
return response;
5
Mr.Vicky

Exemple pour copier un fichier:

void copyFile_dd(){
    try {           
        Process su;

        su = Runtime.getRuntime().exec("su");

        String cmd = "dd if=/mnt/sdcard/test.dat of=/mnt/sdcard/test1.dat \n"+ "exit\n";
        su.getOutputStream().write(cmd.getBytes());

        if ((su.waitFor() != 0)) {
            throw new SecurityException();
        }

    } catch (Exception e) {
        e.printStackTrace();
        //throw new SecurityException();
    }
}
1
ShivBuyya