2016-06-24 3 views
1

나는 안드로이드에서 명령을 내리고 결과를 알려주는 애플리케이션을 만들려고한다. 이것은 더 나은 출력을 위해 잠시 동안 기다리는 명령이 올바르게 처리되지 않는다는 예외적 인 경우에도 잘 작동하는 것 같습니다. "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