2011-04-27 4 views
0

리눅스에서 GNOME 터미널 프로세스를 시작하고 입력 및 출력을 내 코드로 리디렉션하려면 java를 사용하십시오. 아래는 코드입니다.자바 프로세스 IO

 public static void main(String[] args) throws InterruptedException 
    { 
     // TODO Auto-generated method stub /usr/bin/telnet 
     try 
     { 
      String line, commandInput; 
      Scanner scan = new Scanner(new File("/home/Ashutosh/Documents/testfile")); 
      ProcessBuilder telnetProcessBuilder = new ProcessBuilder("/bin/bash");///home/Ashutosh/Documents/tempScript"); 
      telnetProcessBuilder.redirectErrorStream(true); 
      Process telnetProcess = telnetProcessBuilder.start(); 
      //Process telnetProcess = Runtime.getRuntime().exec("xterm");///home/Ashutosh/Documents/tempScript"); 
      BufferedReader input = new BufferedReader(new InputStreamReader(telnetProcess.getInputStream())); 
      BufferedWriter output = new BufferedWriter(new OutputStreamWriter(telnetProcess.getOutputStream())); 
      while(scan.hasNext()) 
      { 
       commandInput = scan.nextLine(); 
       output.write(commandInput); 
/*    if(commandInput.trim().equals("exit")) 
       { 
        output.write("exit\r"); 
       } 
       else 
       { 
        output.write("((" + commandInput + ") && echo --EOF--) || echo --EOF--\r"); 
       } 
*/    output.flush(); 
       line = input.readLine(); 
       while(line != null && !line.trim().equals("--EOF--")) 
       { 
        System.out.println(line); 
        line = input.readLine(); 
       } 
       if(line == null) 
        break; 
      } 
/*   Thread.sleep(500); 
      output.write("/home/Ashutosh/Documents/testfile\r"); 
      Thread.sleep(500); 
      output.flush(); 

      while((line = input.readLine())!= null) 
       System.out.println(line); 
      telnetProcess.destroy(); 
*/   //String s = input.readLine(); 
      //System.out.print(s + "\r\n"); 
      //s = input.readLine(); 
      //System.out.print(s + "\r\n"); 
     } 

bash는 스크립트 testfile 위의 내용은

#!/bin/bash 

ls -l 
pwd 
date 
exit 

이며, 나 또한

#! /bin/bash 
echo "Input any number form 0-3:" 
read num 
case $num in 
    0) echo "You are useless";; 
    1) echo "You are number 1";; 
    2) echo "Too suspecious";; 
    3) echo "Thats all man, got to go...!";; 
    *) echo "Cant't u read english, this is wrong choice";; 
esac 
read 
exit 

을 주어 내가 자바 코드에서 리디렉션하려는 사용자로부터 입력을 받아 다음과 같은 대화 형 스크립트를 시도

내 코드가 input.readLine();에서 멈췄지만 출력 스트림을 리디렉션 할 수 없다고 생각합니다.

output.write(commandInput); 

명령이 제대로 실행되고 있지만 리디렉션 된 입력에 대한 처리를 의도하지 않았습니다. 이유는 readLine();입니다. 누군가 이미 해결했다면 해결책을 알려주십시오. 마지막에 줄 바꿈하지 않고,

Java Process with Input/Output Stream

감사

아슈

답변

1

안녕 얘들 아, 몇 가지 실험 후 나는 그것을 작업 얻었다. 나는 단순히 강제로 자신의 프로세스 종료를 완료 일반적보다는 과정을시키고있다 다음의 BufferedReader와 BufferedWriter의 내가 0

public static void main(String[] args) throws InterruptedException 
{ 
    // TODO Auto-generated method stub 
    try 
    { 
     String line, commandInput; 
     ProcessBuilder telnetProcessBuilder = new ProcessBuilder("/bin/bash"); 
     telnetProcessBuilder.redirectErrorStream(true); 
     Process telnetProcess = telnetProcessBuilder.start(); 
     BufferedReader input = new BufferedReader(new InputStreamReader(telnetProcess.getInputStream())); 
     BufferedWriter output = new BufferedWriter(new OutputStreamWriter(telnetProcess.getOutputStream())); 
     commandInput = "ls -l\n"; 
     output.write(commandInput); 
     output.flush(); 
     commandInput = "pwd\n"; 
     output.write(commandInput); 
     output.flush(); 
     commandInput = "whoami\n"; 
     output.write(commandInput); 
     output.flush(); 
     commandInput = "exit\n"; 
     output.write(commandInput); 
     output.flush(); 
     while((line = input.readLine())!= null) 
      System.out.println(line); 
    } 
} 
2

내의 readLine() 라인의 내용을 읽어 링크를 다음에서 내가이 문제하지만 여전히 행운을 해결하기 위해 시도 .

write()는 텍스트 만 씁니다. 새 행은 추가하지 않습니다.

아마도 쓰기 ("\ n")를 추가하려고합니다. 또는 PrintStream 또는 PrintWriter를 사용하십시오. 내가 상상

이 스크립트는 줄 바꿈없는 코멘트입니다

#!/bin/bashls -lpwddateexit 

로 전송되고있다.

+0

안녕하세요 베드로 후에도 코드로 프로세스 종료 후 지금 읽을 수있는 RAM의 문자열 버퍼를 유지 문자열에 명령을 읽은 후 "\ n"또는 "\ r"을 추가해도 아무런 변화가 없으며 무엇이 문제가 될 수 있는지 확실하지 않습니까? – Ashutosh

1

편집 : ProcessBuilder에 명령을 추가하지 않은 큰 오류!

왜 리눅스 스크립트로 스크립트를 실행하지 않고 있습니까? 즉 나는 변수가 'telnetProcess'이라는 통지 아직 내가 볼 수있는 어느 곳 텔넷의 어떤 호출이 없다, 또한

ProcessBuilder builder = new ProcessBuilder(); 
LinkedList<String> command = new LinkedList<String>(); 
command.add("/bin/bash"); 
command.add("/home/Ashutosh/Documents/testfile"); 
builder.command(command); 

Process myProc = builder.start(); 

입니다. 아마도 이것이 문제일까요?

편집 : 대화 형 스크립트에 대한 아래 제안 사항을 추가했습니다. 늦게 응답 죄송

ProcessBuilder builder = new ProcessBuilder(); 
LinkedList<String> command = new LinkedList<String>(); 
command.add("/bin/bash"); 
command.add("/path/to/interactiveScript"); 
builder.command(command); 

final Process myProc = builder.start(); 

// Java input goes to process input. 
Thread inputParser = new Thread() { 
    public void run() { 
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(myProc.getOutputStream())); 
    String line = ""; 
    while(line != null) { 
     line = br.readLine(); 
     bw.write(line); 
     bw.newLine(); 
    } 
    } 
}.start(); 

// Process output must go to Java output so user can see it! 
Thread outputParser = new Thread() { 
    public void run() { 
    BufferedReader br = new BufferedReader(new InputStreamReader(myProc.getInputStream())); 
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); 
    String line = ""; 
    while(line != null) { 
     line = br.readLine(); 
     bw.write(line); 
     bw.newLine(); 
    } 
    } 
}.start(); 
+0

나는 그 객체의 어리석은 이름을 알고있다. 그러나 이것은 telnet과는 아무런 관련이 없다. 단지 자바 프로세스 IO를 테스트하고자하는 단순한 간단한 테스트 애플리케이션이다. 내 응용 프로그램 중 하나에서 사용자가 개입하지 않고 모든 스크립트를 실행하고 사용자에게 모든 출력을 보내는이 Java 응용 프로그램을 호출해야합니다. – Ashutosh

+0

위의 코드에서 Java 응용 프로그램에서/bin/bash를 실행하고 출력 스트림에서 bash가 stdin에서 읽고 그것을 처리하기를 바라며 작업을 보냅니다. 우선 스크립트를 실행하고 출력을 출력하기 위해 "/ bin/bash/home/Ashutosh/Document/testfile"명령을 사용하여 앞서 제안한 간단한 옵션을 시도해야한다고 생각합니다. 일단 이것이 끝나면 bash의 stdin 처리로 놀 수 있습니다. – Bringer128

+0

두 번째 대화식 스크립트도 다르게 처리해야합니다. 대화 형 스크립트에는 두 가지 효과적인 실행 스레드가 있습니다. 첫 번째는 Java가 하위 프로세스로 전달해야하는 사용자 입력입니다. 이렇게하려면 System.in()에서 입력을 가져 와서 Process.getOuputStream()으로 푸시해야합니다. 자식 프로세스가 Java 프로그램이 Process.getInputStream()에서 읽어 와서 System.out()으로 출력해야하는 것을 인쇄 할 때도 마찬가지입니다. – Bringer128