사용자 도구

사이트 도구


java:ssh

차이

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

차이 보기로 링크

양쪽 이전 판 이전 판
다음 판
이전 판
java:ssh [2015/08/18 15:45]
kwon37xi [Java SSH]
java:ssh [2015/08/20 15:04] (현재)
kwon37xi
줄 5: 줄 5:
   * [[http://www.jcraft.com/jsch/examples/|JSch Examples]]   * [[http://www.jcraft.com/jsch/examples/|JSch Examples]]
   * [[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 예제, 일반/에러 스트림 =====
 +<code java>
 +JSch jsch = new JSch();
 +
 +String host = "[hostname]";
 +String username = "[usrname]";
 +jsch.addIdentity("~/.ssh/id_rsa");
 +
 +Session session = jsch.getSession(username, host, 22);
 +
 +Properties sessionConfig = new Properties();
 +sessionConfig.put("StrictHostKeyChecking", "no");
 +session.setConfig(sessionConfig);
 +session.connect();
 +
 +ChannelExec channel = (ChannelExec) session.openChannel("exec");
 +channel.setCommand("/bin/ls /usr/share; /err/ls /etc; /bin/ls /etc"); // 일반 -> 에러 -> 일반 스트림 테스트
 +
 +// null이면 입력이 없다는 뜻. System.in 을 지정할 경우 스트림이 안 닫히기 때문에 종료가 안되는 듯.
 +channel.setInputStream(null);
 +
 +// 출력 스트림을 명시적으로 받아서 처리할 것이므로 설정하지 않는다.
 +// channel.setOutputStream(System.out);
 +// channel.setErrStream(System.err);
 +
 +// 출력 스트림을 호출하면 출력 스트림을 끝까지 읽고 처리해줘야 함.
 +InputStream inputStream = channel.getInputStream(); // <- 일반 출력 스트림
 +final InputStream errStream = channel.getErrStream();// <- 일반 에러 스트림
 +byte[] buffer = new byte[BUFFER_SIZE];
 +
 +channel.connect();
 +
 +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 (inputStream.available() > 0 || errStream.available() > 0) {
 +            continue;
 +        }
 +        break;
 +    }
 +
 +    TimeUnit.MILLISECONDS.sleep(100);
 +}
 +
 +final int exitStatus = channel.getExitStatus();
 +System.out.println("Exit Status : " + exitStatus);
 +
 +channel.disconnect();
 +session.disconnect();
 +</code>
 +
 +==== 입력 스트림을 주고 싶을 때 간단한 예 ====
 +<code java>
 +// channel 객체 생성 후
 +InputStream userInput = new ByteArrayInputStream("이런 저런 내용...".getBytes("UTF-8"));
 +channel.setInputStream(userInput);
 +// 그외 작업 실행..
 +</code>
 +
 +
 +
 +===== Channels =====
 +  * ''com.jcraft.jsch.Channel''에서 채널 종류를 볼 수 있다. 주요한 것들은
 +  * ''session''
 +  * ''shell''
 +  * ''exec''
 +  * ''x11''
 +  * ''sftp''
 +
java/ssh.1439882150.txt.gz · 마지막으로 수정됨: 2015/08/18 15:45 저자 kwon37xi