반응형
package com.company.aa;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Reader;

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpException;
import com.jcraft.*;

public class Linux {

	public void runCommand(String userName, String password, String ip, String command)
			throws IOException, JSchException {

		Channel channel = null;

		// 1. 서버 연결
		Session session = connect(userName, password, ip);

		// 2. 리눅스 명령어 실행가능한 객체 생성
		ChannelExec channelExec = makeChannelExec(session, channel);

		// 3. 실행할 명령어 설정
		setCommand(channelExec, command);

		// 4. 응답값을 안 받아올 경우 실행하고 실행도중에 바로 연결을 끊기 때문에 그에 대한 응답값을 받아오는 과정이 필요하다
		String result = getCommandReturn(channelExec);

		// 5. 연결 끊기
		disconnect(channel, session);
	}

	public String getReturn(String userName, String password, String ip, String command)
			throws IOException, JSchException {

		Channel channel = null;

		// 1. 서버 연결
		Session session = connect(userName, password, ip);

		// 2. 리눅스 명령어 실행가능한 객체 생성
		ChannelExec channelExec = makeChannelExec(session, channel);

		// 3. 실행할 명령어 설정
		setCommand(channelExec, command);

		// 4. 명령어 결과를 읽어내는 과정
		String result = getCommandReturn(channelExec);

		// 5. 연결 끊기
		disconnect(channel, session);

		return result;
	}

	public void transferFile(String userName, String password, String ip, String sourcePath, String destinationPath)
			throws IOException, JSchException, SftpException {

		Channel channel = null;

		// 서버 연결
		Session session = connect(userName, password, ip);

		// sftp 준비
		ConnectChannelSftp(channel, session, sourcePath, destinationPath);

		// 연결 끊기
		disconnect(channel, session);

	}

	private void ConnectChannelSftp(Channel channel, Session session, String sourcePath, String destinationPath)
			throws JSchException, SftpException {

		ChannelSftp channelSftp = null;

		channel = session.openChannel("sftp");
		channel.connect();
		channelSftp = (ChannelSftp) channel;
		channelSftp.put(sourcePath, destinationPath); // 파일을 전송하는 메소드
		channelSftp.disconnect();
	}

	private ChannelExec makeChannelExec(Session session, Channel channel) throws JSchException {

		// sftp 채널을 연다.
		channel = session.openChannel("exec");

		// 채널을 SSH용 채널 객체로 캐스팅한다 → 연 채널의 명령어를 입력할 수 있는 구조로 바꾸는 과정
		ChannelExec channelExec = (ChannelExec) channel;
		channelExec = (ChannelExec) session.openChannel("exec");

		return channelExec;
	}

	private Session connect(String userName, String password, String ip) throws JSchException {

		Session session = null;

		// ssh 포트
		int port = 22;

		// JSch 객체[리눅스 연결]를 생성한다.
		JSch jsch = new JSch();
		session = jsch.getSession(userName, ip, port);

		// 패스워드를 설정한다.
		session.setPassword(password);

		// 세션과 관련된 정보를 설정한다.
		java.util.Properties config = new java.util.Properties();

		// 호스트 정보를 검사하지 않는다.
		config.put("StrictHostKeyChecking", "no");
		session.setConfig(config);

		// 접속한다.
		session.connect();

		return session;
	}

	private void disconnect(Channel channel, Session session) {
		if (channel != null)
			channel.disconnect();
		if (session != null)
			session.disconnect();
	}

	private void setCommand(ChannelExec channelExec, String command) throws IOException, JSchException {

		// 7. 명령어 실행할 명령어 설정
		channelExec.setCommand(command);
		channelExec.connect();

		channelExec.setErrStream(System.err);

	}

	public String getCommandReturn(ChannelExec channelExec) throws IOException, JSchException {

		// 8. 명령어 결과를 읽어 과정
		BufferedReader inputStream = new BufferedReader(new InputStreamReader(channelExec.getInputStream(), "utf-8"));

		StringBuilder response = new StringBuilder();
		String line;

		while ((line = inputStream.readLine()) != null) {
			response.append(line + '\n');
//			System.out.println(line);
		}

		return response.toString();
	}

}
<dependency>
    <groupId>com.jcraft</groupId>
    <artifactId>jsch</artifactId>
    <version>0.1.54</version>
</dependency>
반응형