[Java] 자바에서 리눅스 서버 접속 및 명령어(커맨드) 실행 하는 법

2021-12-31


https://pixabay.com/images/id-6889575/

자바 내에서 리눅스 서버에 접속하여 명령어를 실행하는 방법을 알아보자.


- 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/