Java와 SSH
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); // 그외 작업 실행..
com.jcraft.jsch.Channel
에서 채널 종류를 볼 수 있다. 주요한 것들은session
shell
exec
x11
sftp