Java로 ssh 접속 및 commad 실행 (JSch)

Yoon·2024년 2월 26일
0

java

목록 보기
8/8

0. 개요

고도화 프로젝트를 진행중에 있는데,
AS-IS는 서버 1개로 시스템이 다 돌아가는 반면
TO-BE는 서버 2개로 나뉘게 되었다.

기존에 있던 커스터마이징 된 jar 파일이
해당 서버의 경로를 찾아 쉘파일을 실행시키는 식으로 작성이 되어 있었는데
바뀐 TO-BE에서는 A서버에서 실행하는 것이 아닌 B서버에서 실행 해야 하므로 SSH 원격접속을 찾아보았다.

1. Setting

  1. pom.xml 이나 gradle 에서 Jsch(Java Secure Channel) dependency를 추가한다.
<dependency>
  <groupId>com.jcraft</groupId>
  <artifactId>jsch</artifactId>
  <version>0.1.55</version>
</dependency>
compile group: 'com.jcraft', name: 'jsch', version: '0.1.55'

2. 사용

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는 잘 마무리 될것 같다 ..

profile
나의 공부 일기

0개의 댓글