[공부] JSch 오류 처리!

HOU·2023년 11월 10일

backend

목록 보기
3/10

이슈

서비스가 계속해서 멈추는 이슈가 발생했다. web 서버가 총 4개로 구성되어 있는데, 첫번째 서버가 멈추면 그 이후로 2,3,4 번의 서버들이 멈추는 문제가 발생했다. 계속해서 멈추고 오류를 확인해보니 JSch를 부르는 컨트롤러 이후에 어떤 로그도 작성되어있지 않았다.

왜 발생하였는가?

JSch 관련해서 검색해보니 hang현상이 존재하는 것을 확인 할 수 있었다. 구글에 검색해보니 hangup현상이 발견되는 경우가 있었고 특히 현재 사용하고 있는 jsch-0.1.55 버전에서 hang 현상이 발견되는 경우가 많았다

어떻게 해결?

구글에 검색해보니 여러 방법들이 있었는데 그 중에서 테스트해본것이 settimeout 메서드를 사용해서 시간이 초과되는 경우에 session을 끊어내는 방법을 사용했다. 어떤 경우에는 settimeout 메서드를 활용해도 hang 현상이 발견되는 경우가 있다고 했지만 우선 가장 기본적인 것을 적용해보기로 했고 정상적으로 작동하는 것을 볼 수 있었다.

JSch란?

javasftp로 파일 전송 및 다른 서버로 접속하여 명령어를 실행하게 해주는 라이브러리 이다.

JSch is a pure Java implementation of SSH2.
JSch allows you to connect to an sshd server and use port forwarding, X11 forwarding, file transfer, etc., and you can integrate its functionality into your own Java programs. JSch is licensed under BSD style license.

JSch는 SSH2의 순수한 Java 구현입니다.
JSch를 사용하면 sshd 서버에 연결하여 포트 포워딩, X11 포워딩, 파일 전송 등을 사용할 수 있으며, 해당 기능을 자체 Java 프로그램에 통합할 수 있습니다. JSch는 BSD 스타일 라이선스에 따라 라이선스가 부여됩니다.

jcraft document에는 위처럼 작성되어있는데,, x11wiredX에 대해서 찾아보았다. X window system이란다. 리눅스에서 gui방식으로 윈도우 환경과 유사한 interface를 제공하고, linux를 처음 사용하는 사람들에게 쉽게 사용할 수 있는 편리성을 제공한다.

JSch 간단 사용법

  1. JSch 클래스를 생성한다.
  2. ssh를 통해서 연결한다.
  3. 원하는 행위를 연결한 서버로 전송한다.

pom.xml

<dependancy>
  <groupId>com.jcraft</groupId>
  <artifactId>jsch</artifactId>
  <version>0.1.54</version>
</dependancy>
import java.time.LocalDateTime;
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpProgressMonitor;

public class SFTPSender {
    private String ADDRESS = "접속할주소";
    private int PORT = 22;  //포트번호
    private String USERNAME = "아이디";
    private String PASSWORD = "비밀번호";
    private static Session session = null;
    private static Channel channel = null;
    private static ChannelSftp channelSftp = null;

    public void sshAccess() throws Exception {
        JSch jsch = new JSch();
        session = jsch.getSession(USERNAME, ADDRESS, PORT);  //세션 오픈!
        session.setPassword(PASSWORD);
        java.util.Properties config = new java.util.Properties();
        config.put("StrictHostKeyChecking", "no");
        session.setConfig(config);
        
        //이부분은 내가 추가!
        session.setTimeout(config.connectionTimeout);//set timeout for connection
        session.connect();
        session.setTimeout(conf.dataTimeout); //set timeout for data transfer
    }
}
출처: https://js2prince.tistory.com/?page=4 [개발은 전투다:티스토리]

위에처럼 커넥트 부분에 connection 과정의 timeout과 data부분의 timeout 을 설정했다.

배운점

jsch라는 사실을 처음 알았다. 새로운것을 배우는것은 참 재미있는 경험이다. 그리고 스스로가 아직도 많이 부족하다는 것을 많이 느낄 수 있었다.

참조

jcraft-jsch
나무위키-x11
유애님 블로그
요르딩딩님 블로그
개발은 전투다

profile
하루 한 걸음 성장하는 개발자

0개의 댓글