본문 바로가기

Java/공부공부

[Java] 자바에서 리눅스 명령어 실행 (JSch , Session , ChannelExec )

 

 

[ JSch ]

SSH 연결을 위한 세션을 생성하고 관리하는 기본 클래스. (팩토리 역할)

import com.jcraft.jsch.JSch;

JSch jsch = new JSch();  // JSch 객체 생성

 

 

[ Session ]

실제로 SSH 서버와 연결을 수립하고 통신을 담당하는 객체.

Session session = jsch.getSession("username", "hostname", 22); // JSch 객체를 통해 Session 생성
session.setPassword("password");  // 비밀번호 설정
session.setConfig("StrictHostKeyChecking", "no");  // 추가 설정

session.connect();  // SSH 연결 수립

=> JSch 객체의 .getSession() 메소드를 통해 Session 객체를 생성.

 

 

[ ChannelExec ]

JSch 라이브러리에서 원격 서버에 SSH로 명령어를 실행할 수 있는 채널 유형 중 하나. ( "exec" 타입 채널 )

단일 명령어 실행.

Channel channel = session.openChannel("exec");
((ChannelExec) channel).setCommand(command);

channelExec.connect();

 

 - setCommand(String command) : 실행할 명령어를 설정.

 

 

(결과값 읽기)

1. InputStream에서 직접 대기하며 읽기 (실시간)

InputStream in = channelExec.getInputStream();
byte[] buffer = new byte[1024];

while (true) {
    // 읽을 수 있는 데이터가 있는지 확인
    if (in.available() > 0) {
        int bytesRead = in.read(buffer);
        System.out.print(new String(buffer, 0, bytesRead));
    }
    // 명령어가 종료되었는지 확인
    if (channelExec.isClosed()) {
        break;
    }
}

channelExec.disconnect();
session.disconnect();

 

 

2. BufferedReader와 Stream API 사용.

BufferedReader reader = new BufferedReader(new InputStreamReader(channelExec.getInputStream()));
String result = reader.lines().collect(Collectors.joining("\n"));  // 결과를 한 번에 수집
System.out.println(result);  // 명령어 실행 결과 출력
System.out.println("Exit Status: " + channelExec.getExitStatus());

channelExec.disconnect();
session.disconnect();