Чтение вывода команды внутри процесса su

во-первых, я расскажу о своей ситуации. Мне нужно выполнить команду su в моем приложении для Android, и она работает хорошо. Затем мне нужно выполнить команду «ls» и прочитать результат. Я делаю это, получая выходной stream из процесса su и записывая в него свою команду.

И вот вопрос. Как читать выходные данные процесса «ls»? Все, что у меня есть, это объект процесса su. Получение входного streamа от него ничего не дает, потому что «su» ничего не пишет. Но «ls» делает, и я не знаю, как получить доступ к его выходным сообщениям.

Я искал много сайтов, но я не нашел решения. Может, кто-то мне поможет 🙂

С уважением

Хорошо, я нашел решение. Он должен выглядеть так:

Process p = Runtime.getRuntime().exec(new String[]{"su", "-c", "system/bin/sh"}); DataOutputStream stdin = new DataOutputStream(p.getOutputStream()); //from here all commands are executed with su permissions stdin.writeBytes("ls /data\n"); // \n executes the command InputStream stdout = p.getInputStream(); byte[] buffer = new byte[BUFF_LEN]; int read; String out = new String(); //read method will wait forever if there is nothing in the stream //so we need to read it in another way than while((read=stdout.read(buffer))>0) while(true){ read = stdout.read(buffer); out += new String(buffer, 0, read); if(read 

Надеюсь, это будет полезно для кого-то

 public String ls () { Class execClass = Class.forName("android.os.Exec"); Method createSubprocess = execClass.getMethod("createSubprocess", String.class, String.class, String.class, int[].class); int[] pid = new int[1]; FileDescriptor fd = (FileDescriptor)createSubprocess.invoke(null, "/system/bin/ls", "/", null, pid); BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(fd))); String output = ""; try { String line; while ((line = reader.readLine()) != null) { output += line + "\n"; } } catch (IOException e) {} return output; } 

Проверьте этот код, упомянутый здесь:

Как запустить команду терминала в приложении Android?


 try { // Executes the command. Process process = Runtime.getRuntime().exec("/system/bin/ls /sdcard"); // Reads stdout. // NOTE: You can write to stdin of the command using // process.getOutputStream(). BufferedReader reader = new BufferedReader( new InputStreamReader(process.getInputStream())); int read; char[] buffer = new char[4096]; StringBuffer output = new StringBuffer(); while ((read = reader.read(buffer)) > 0) { output.append(buffer, 0, read); } reader.close(); // Waits for the command to finish. process.waitFor(); return output.toString(); } catch (IOException e) { throw new RuntimeException(e); } catch (InterruptedException e) { throw new RuntimeException(e); } 

Рекомендации

этот код GScript

Я изменил принятый ответ на @glodos для следующих проблем:

  1. streamи закрыты, иначе процесс exec зависает вечно, в открытом streamе. Если вы выполните ps в оболочке (например, adb shell ) после нескольких исполнений, вы увидите несколько su процессов. Они должны быть надлежащим образом завершены.
  2. добавлена waitFor() чтобы убедиться, что процесс завершен.
  3. Добавлена ​​обработка для read=-1 , теперь могут выполняться команды с пустой stdout . Раньше они разбивались на new String(buffer, 0, read)
  4. Использование StringBuffer для более эффективной обработки строк.

     private String execCommand(String cmd) throws IOException, InterruptedException { Process p = Runtime.getRuntime().exec(new String[]{"su", "-c", "system/bin/sh"}); DataOutputStream stdout = new DataOutputStream(p.getOutputStream()); stdout.writeBytes(cmd); stdout.writeByte('\n'); stdout.flush(); stdout.close(); BufferedReader stdin = new BufferedReader(new InputStreamReader(p.getInputStream())); char[] buffer = new char[1024]; int read; StringBuffer out = new StringBuffer(); while((read = stdin.read(buffer)) > 0) { out.append(buffer, 0, read); } stdin.close(); p.waitFor(); return out.toString(); } 

Некоторые кредиты идут на @Sherif elKhatib))

Давайте будем гением компьютера.