목차

Java SSH

Java와 SSH

JSch

기본 Exec 예제, 일반/에러 스트림

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();

입력 스트림을 주고 싶을 때 간단한 예

// channel 객체 생성 후
InputStream userInput = new ByteArrayInputStream("이런 저런 내용...".getBytes("UTF-8"));
channel.setInputStream(userInput);
// 그외 작업 실행..

Channels