2016-06-24 1 views
1

Я пытаюсь создать приложение, которое позволит мне выпускать команды в android и давать мне результаты. Кажется, что он отлично работает, за исключением того, что команды, которые ждут некоторое время для большего вывода, не обрабатываются правильно. Я пытаюсь выдать команду «su & & nmap -sS 192.168.1.1», и все, что я получаю для вывода, это запуск nmap. Кто-нибудь знает способ не только получить вывод, который начал nmap, но и результаты сканирования, используя измененную версию кода ниже.Android java InputStreamReader

try { 
     EditText inputTxt = (EditText) findViewById(R.id.input); 
     String str = inputTxt.getText().toString(); 
     Process command = Runtime.getRuntime().exec(str); 

     BufferedReader reader = new BufferedReader(
       new InputStreamReader(command.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(); 

     TextView textView = (TextView) findViewById(R.id.textView); 
     textView.setText(output); 

    } 
    catch (IOException e) { 
     Log.e("Run_Command", Log.getStackTraceString(e)); 
    } 
+1

Может быть, 'su' только что ждет пароль? –

+0

Вам необходимо закрыть выходной поток, который является входом в процесс. – EJP

ответ

-1

Я придумал другую версию кода. Этот использует thread.sleep и не имеет буфера фиксированного размера.

Все, что я получаю для вывода, это то, что nmap запустился, а не результаты сканирования, даже если сканирование завершилось к завершению окончательного завершения thread.sleep.

public void command(View view) 
{ 
    String me; 
    int a = 0; 
    try { 
     EditText inputTxt = (EditText) findViewById(R.id.input); 
     String str = inputTxt.getText().toString(); 
     Process command = Runtime.getRuntime().exec(str); 

     BufferedReader bReader = new BufferedReader(
       new InputStreamReader(command.getInputStream(), "UTF8")); 
     //char [] me = new char[40960]; 
     String inputLine; 
     while(1 == 1){ 
      if(a == 5) { 
       break;} 

     while ((inputLine = bReader.readLine()) != null) { 
      me += inputLine + "\n"; 
     } 
      while(bReader.readLine() == null) { 
       a++; 
       Thread.sleep(5000); 
       if (a == 5) { 
        break; 
       } 
      } 
        } 
     bReader.close(); 

     TextView textView = (TextView) findViewById(R.id.textView); 
     textView.setText(me); 

    } 
    catch (IOException e) { 
     Log.e("Run_Command", Log.getStackTraceString(e)); 
    } 
    catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 
+2

Бессмысленный. Как только 'readLine()' возвращает null, вот и все. Вы можете спать отныне до Судного Дня, но больше не будет никакого ввода. – EJP

+0

Должен быть способ получить выход, верно? Возможно, я ошибался? – Fuion