====== Java SSH ======
Java와 SSH
====== JSch ======
* [[http://www.jcraft.com/jsch/|JSch]] Java Secure Channel
* [[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]]
===== 기본 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 =====
* ''com.jcraft.jsch.Channel''에서 채널 종류를 볼 수 있다. 주요한 것들은
* ''session''
* ''shell''
* ''exec''
* ''x11''
* ''sftp''