2012-07-25 1 views
0

더 구체적으로 말하면, 실제로하고 싶은 것은 두 개의 새로운 터미널을 여는 것입니다. terminal_1에서 나는 ssh @ host1로 가고 program1을 host1로 실행하고 싶다. 터미널 _2에서 ssh @ host2로 이동하고 program2를 host2로 실행합니다. 터미널 1에서 보려는 program1의 출력과 터미널 2에서 볼 수있는 program2의 출력이 필요합니다. 원격 호스트에 새로운 터미널 ssh를 열고 원격 호스트에 프로그램을 실행하십시오. 새로운 열린 터미널에서 볼 수있는 모든 출력

는 (I 텀과 ssh를 @를하게 대접이 두 번째 명령 "& & 자바 echo_1"을 통과하려고 열 관리해야하지만 아무것도 전혀하지 않습니다) 여기

를 코드입니다 :

import java.io.*; 

public class multi1 implements Runnable { 

    public void run() { 

    try { 
     String ss = null; 
      Runtime obj = null; 
     String[] newcmd = new String[]{"/usr/bin/xterm","-hold","-e","ssh [email protected]&&java echo_1"}; 

     Process p = Runtime.getRuntime().exec(newcmd); 

      BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream())); 
      BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream())); 

      while ((ss = stdInput.readLine()) != null) { 
        System.out.println(ss); 
      } 
     }catch (IOException e) { 
      System.out.println("FROM CATCH" + e.toString()); 
     } 
    } 

    public static void main(String[] args) throws Exception { 
     Thread th = new Thread(new multi1()); 
     th.start(); 
    //Thread th2 = new Thread(new multi1()); 
    //th2.start(); 
    } 
} 

답변

0

나는 대신 jsch 또는 다른 ssh 라이브러리를 사용하고 터미널 및 exec없이 수행합니다.

+0

echo_1은 오랜 시간 실행되어 이벤트가 도착한 후에 특정 출력을 제공하는 프로그램입니다. 그 출력을 로컬에서 모니터해야합니다. jsch 라이브러리로 가능합니까? 감사합니다 – Andreas

+0

jsch를 사용하면 SSH와 연결하여 출력 및 입력 스트림을 얻을 수 있습니다. 문제가 될 때가 있습니다. –

+0

안녕 Aviram, 작업은 jsch 감사를 사용하여 완료되었습니다! 당신이 솔루션을 가지고 있을지도 모르는 문제가 있습니다. ls 또는 java javaprogram 또는 ./cprogram을 실행하면 in.available> 0이고 출력을 검색하지만 프로그램/usr/local/bin/click_program을 실행할 때 , in.available()은 0이지만 출력은 터미널에 인쇄됩니다. 어떻게 가능합니까 ?? 왜 나는 그 출력을 검색 할 수 없습니까? – Andreas

0

관심사 하나 나는 즉시 스폰 된 프로세스에서 stdout/stderr를 처리하지 않는다는 점에 유의해야합니다. 이렇게하지 않으면 프로세스 및 프로세스 자체의 출력을 차단할 수 있습니다. 자세한 내용은 this answer을 참조하십시오.

0
BufferedReader stdError = .. 

이클립스는 다시 참조하지 않는 것으로 경고합니다. 이는 오류 스트림이 소비되지 않음을 나타냅니다. 그렇게해라.

Process 사용에 대한 추가 팁은 runtime.exec info. page에 링크 된 기사를 참조하십시오. 또한 ProcessBuilder을 사용하는 것이 더 좋으며 System.outSystem.err을 병합 할 수 있으므로 두 루프를 모두 사용하는 것이 더 쉽습니다.