사용자 도구

사이트 도구


java:ssh

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판 이전 판
다음 판
이전 판
java:ssh [2015/08/18 16:27]
kwon37xi
java:ssh [2015/08/20 15:04] (현재)
kwon37xi
줄 6: 줄 6:
   * [[http://www.journaldev.com/246/java-program-to-run-shell-commands-on-ssh-enabled-system|Java Program to run shell commands on SSH enabled System]]   * [[http://www.journaldev.com/246/java-program-to-run-shell-commands-on-ssh-enabled-system|Java Program to run shell commands on SSH enabled System]]
  
-===== 가장 기본 exec 채널 ===== +===== 기본 Exec 예제, 일반/에러 스트림 =====
-Private Key를 통해 접속하여 명령을 실행하고 그 결과를 현재 출력/에러 스트림으로 보내는 가장 간단한 예제. +
 <code java> <code java>
 JSch jsch = new JSch(); JSch jsch = new JSch();
  
 String host = "[hostname]"; String host = "[hostname]";
-String username = "[username]"; +String username = "[usrname]"; 
-jsch.addIdentity("/path/to/.ssh/id_rsa");+jsch.addIdentity("~/.ssh/id_rsa");
  
 Session session = jsch.getSession(username, host, 22); Session session = jsch.getSession(username, host, 22);
줄 24: 줄 22:
  
 ChannelExec channel = (ChannelExec) session.openChannel("exec"); ChannelExec channel = (ChannelExec) session.openChannel("exec");
-channel.setCommand("/bin/ls /etc");+channel.setCommand("/bin/ls /usr/share; /err/ls /etc; /bin/ls /etc"); // 일반 -> 에러 -> 일반 스트림 테스트
  
-// setInputStream을 호출하면 InputStream을 닫아주는 작업도 올바로 해야함.+// null이면 입력이 없다는 뜻. System.in 을 지정할 경우 스트림이 안 히기 때문에 종료가 안되는 .
 channel.setInputStream(null); channel.setInputStream(null);
  
-// 출력 내용을 System 스트림으로 보내게 함+// 출력 스트림을 명시적으로 받아서 처리할 것이므로 설정하지 않는다
-channel.setOutputStream(System.out); +// channel.setOutputStream(System.out); 
-channel.setErrStream(System.err);+// channel.setErrStream(System.err);
  
-// 출력 스트림을 호출하면 출력 스트림을 읽고 닫아주는 작업도 해야함. +// 출력 스트림을 호출하면 출력 스트림을 끝까지 읽고 처리야 함. 
-// 여기서는 System.out과 System.err이 처리하게 둠. +InputStream inputStream = channel.getInputStream(); // <- 일반 출력 스트림 
-// channel.getInputStream(); // <- 일반 출력 스트림 +final InputStream errStream = channel.getErrStream();// <- 일반 에러 스트림 
-// channel.getErrStream(); // <- 일반 에러 스트림+byte[] buffer = new byte[BUFFER_SIZE];
  
 channel.connect(); channel.connect();
  
 while(true) { while(true) {
 +    while (inputStream.available() > 0) {
 +        int i = inputStream.read(buffer, 0, BUFFER_SIZE);
 +        if (i < 0) {
 +            break;
 +        }
 +
 +        System.out.println(new String(buffer, 0, i));
 +    }
 +
 +    while (errStream.available() > 0) {
 +        int i = errStream.read(buffer, 0, BUFFER_SIZE);
 +        if (i > 0) {
 +            System.err.println(new String(buffer, 0, i));
 +        }
 +    }
 +
     if (channel.isClosed()) {     if (channel.isClosed()) {
 +        if (inputStream.available() > 0 || errStream.available() > 0) {
 +            continue;
 +        }
         break;         break;
     }     }
줄 47: 줄 64:
     TimeUnit.MILLISECONDS.sleep(100);     TimeUnit.MILLISECONDS.sleep(100);
 } }
 +
 +final int exitStatus = channel.getExitStatus();
 +System.out.println("Exit Status : " + exitStatus);
  
 channel.disconnect(); channel.disconnect();
 session.disconnect(); session.disconnect();
 </code> </code>
 +
 +==== 입력 스트림을 주고 싶을 때 간단한 예 ====
 +<code java>
 +// channel 객체 생성 후
 +InputStream userInput = new ByteArrayInputStream("이런 저런 내용...".getBytes("UTF-8"));
 +channel.setInputStream(userInput);
 +// 그외 작업 실행..
 +</code>
 +
 +
  
 ===== Channels ===== ===== Channels =====
java/ssh.1439884664.txt.gz · 마지막으로 수정됨: 2015/08/18 16:27 저자 kwon37xi