고도화 프로젝트를 진행중에 있는데,
AS-IS는 서버 1개로 시스템이 다 돌아가는 반면
TO-BE는 서버 2개로 나뉘게 되었다.
기존에 있던 커스터마이징 된 jar 파일이
해당 서버의 경로를 찾아 쉘파일을 실행시키는 식으로 작성이 되어 있었는데
바뀐 TO-BE에서는 A서버에서 실행하는 것이 아닌 B서버에서 실행 해야 하므로 SSH 원격접속을 찾아보았다.
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.55</version>
</dependency>
compile group: 'com.jcraft', name: 'jsch', version: '0.1.55'
import java.io.InputStream;
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpException;
import com.jcraft.jsch.SftpProgressMonitor;
public class SFTPSender {
public static void order() throws Exception{
JSch jsch = new JSch();
Session session = jsch.getSession(접속아이디, 주소, 포트);
session.setPassword(비밀번호);
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect(); //연결
Channel channel = session.openChannel("exec"); //채널접속
ChannelExec channelExec = (ChannelExec) channel; //명령 전송 채널사용
channelExec.setPty(true);
channelExec.setCommand("ls -al"); //내가 실행시킬 명령어를 입력
//콜백을 받을 준비.
StringBuilder outputBuffer = new StringBuilder();
InputStream in = channel.getInputStream();
((ChannelExec) channel).setErrStream(System.err);
channel.connect(); //실행
byte[] tmp = new byte[1024];
while (true) {
while (in.available() > 0) {
int i = in.read(tmp, 0, 1024);
outputBuffer.append(new String(tmp, 0, i));
if (i < 0) break;
}
if (channel.isClosed()) {
System.out.println("결과");
System.out.println(outputBuffer.toString());
channel.disconnect();
break;
}
}
}
}
Jsch를 활용한 개념은 3단계로 이루어 진다.
1. Jsch 클래스를 생성
2. ssh를 통해 연결
3. 원하는 행위를 연결한 서버로 전송
하나씩 해결해 가면서 TO-BE는 잘 마무리 될것 같다 ..