2021-12-31
자바 내에서 리눅스 서버에 접속하여 명령어를 실행하는 방법을 알아보자.
- build.gradle
// https://mvnrepository.com/artifact/com.jcraft/jsch
implementation group: 'com.jcraft', name: 'jsch', version: '0.1.54'
- import
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import org.junit.Test;
- 예제
@Test
public void commandExTest() {
JSch jSch = new JSch();
Session session;
try {
String id = "abc";
String ip = "111.111.111.111";
Integer port = 8080;
String pw = "abc";
// 접속 정보 세팅
session = jSch.getSession(id, ip, port);
session.setPassword(pw);
Properties properties = new Properties();
properties.put("StrictHostKeyChecking", "no");
session.setConfig(properties);
session.connect();
try {
//명령어 리스트
List<String> commandList = new ArrayList<>();
//순차적 사용할 명령어는 && 묶는 것이 좋다.
commandList.add("cd home/" + " && echo Success");
//리스트에 담긴 명령어 수만큼 실행
for(int i = 0; i < commandList.size(); i++) {
//명령어 실행
execCommand(session, commandList.get(i));
}
}catch (Exception e) {
System.out.println(e.toString());
session.disconnect(); //세션 종료
}
}catch (Exception e) {
System.out.println(e.toString());
}
}
public void execCommand(Session session, String command) {
ChannelExec channelExec = null;
BufferedReader commandReader = null;
try {
channelExec = (ChannelExec) session.openChannel("exec"); //명령어 실행 커맨드 객체 생성
//결과를 가지고 올 bufferReader
commandReader = new BufferedReader(new InputStreamReader(channelExec.getInputStream()));
channelExec.setCommand(command); // 실행할 command 설정
channelExec.connect(); // command 실행
String commandLine = commandReader.readLine();
if(commandLine == null || commandLine.equals("") || !commandLine.equals("Success")) {
commandLine = "Fail";
}
System.out.println(" command Result String -> [ " + commandLine + " ] ");
commandReader.close();
channelExec.disconnect();
} catch (JSchException | IOException e) {
e.printStackTrace();
}finally {
try {
System.out.println(" ===== execCommand Reader Close Error =====");
commandReader.close();
} catch (IOException e) {
e.printStackTrace();
}
channelExec.disconnect();
}
}
명령어를 실행하는 execCommand의 경우 마지막으로 리턴하는 커맨드 라인의 결과 값을 받는데, 이게 Success를 리턴할 경우 앞에 && 묶은 명령어 들은 모두 정상 실행된 후 명령어 echo Success 값이기 때문에 전체 명령어 성공 여부를 체크할 수 있다.
메인 이미지 출처 : https://pixabay.com/images/id-6889575/