๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Java

[Java] JSch๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฆฌ๋ˆ…์Šค ๋ช…๋ น์–ด ์›๊ฒฉ ์ „์†กํ•˜๊ธฐ

์ž๋™ํ™” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฑด ์ค‘์š”ํ•œ ์ผ์ด๋‹ค. ์ด๊ฒŒ ์—†์œผ๋ฉด DB ์‹คํ–‰/๋ฐฑ์—…๊ณผ ๊ฐ™์ด ์ผ์ƒ์ ์ด๋ฉด์„œ ๋ฐ˜๋ณต๋˜๋Š” ์ž‘์—…๋“ค์„ ์ผ์ผ์ด ํ•ด์ค˜์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋ฆฌ๋ˆ…์Šค ์„œ๋ฒ„์— ์ ‘์†ํ•˜๊ณ ... ๋กœ๊ทธ์ธํ•˜๊ณ ... ๋ช…๋ น์–ด ํ•˜๋‚˜ํ•˜๋‚˜๋ฅผ ํ•œ ๋•€ ํ•œ ๋•€ ๋„ฃ์–ด์ฃผ๋Š” ์ผ์€ ๊ฝค๋‚˜ ๊ณ ๋œ ์ผ์ด๋‹ค. ์ด๋Ÿฐ ์ผ๋“ค์„ ์ž๋™ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋ฐ˜์ ์œผ๋กœ ์‰˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์ง€๋งŒ, ํ˜น์‹œ ์ž๋ฐ” ๊ฐœ๋ฐœ์ž๋“ค์„ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์—†์„๊นŒ ์ฐพ์•„๋ณด๋‹ˆ JSch๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค๊ณ  ํ•œ๋‹ค. 


JSch ๋ž€?

๋ฆฌ๋ˆ…์Šค ์„œ๋ฒ„๋ฅผ ์›๊ฒฉ์œผ๋กœ ๊ด€๋ฆฌํ•  ๋•Œ, SSH (Secure Shell)๋ฅผ ํ†ตํ•ด ๋ช…๋ น์–ด๋ฅผ ์ „์†กํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์œˆ๋„์šฐ์—์„œ๋Š” ํŒŒ์ด์ฌ์˜ paramiko ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ž๋ฐ”์—๋„ JSch๋ผ๋Š” ๋น„์Šทํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ๋‹ค.  JSch๋Š” ์ž๋ฐ”๋กœ ๊ตฌํ˜„๋œ SSH2 ํ”„๋กœํ† ์ฝœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ž๋ฐ” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฆฌ๋ˆ…์Šค ์„œ๋ฒ„๋กœ ๋ช…๋ น์–ด๋ฅผ ์ „์†กํ•˜๊ณ  ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. 


๊ธฐ๋ณธ ์ฝ”๋“œ ์˜ˆ์ œ

์•„๋ž˜๋Š” JSch๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฆฌ๋ˆ…์Šค ์„œ๋ฒ„์— ์ ‘์†ํ•˜๊ณ  ๊ฐ„๋‹จํ•œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์˜ˆ์ œ์ด๋‹ค. ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•œ ํ›„ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๋ถ€๋ถ„์—์„œ ํด๋ผ์ด์–ธํŠธ ์ชฝ stream๊ณผ ์„œ๋ฒ„ ์ชฝ stream ๋‘˜ ๋‹ค ๋Œ€๊ธฐ์ƒํƒœ๋กœ ๋“ค์–ด๊ฐ€ ๋ฐ๋“œ๋ฝ์— ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์œผ๋‹ˆ ๊ตฌํ˜„ํ•  ๋•Œ ์ฃผ์˜ํ•ด์•ผํ•œ๋‹ค. 

import java.io.*;
import com.jcraft.jsch.*;

public class JschExample {

	public static void main(String[] args) {
		final String host = "xxx.xxx.xxx.xxx";
		final String username = "yourUsername";
		final String password = "yourPassword";
		final int port = 22;
		Session session = null;

		try {
			JSch jsch = new JSch();
			session = jsch.getSession(username, host, port);
			session.setPassword(password);
			session.setConfig("StrictHostKeyChecking", "no"); // ํ˜ธ์ŠคํŠธ ํ‚ค ๊ฒ€์ฆ ๋น„ํ™œ์„ฑํ™” (๋ณด์•ˆ์ƒ ๊ถŒ์žฅ๋˜์ง€ ์•Š์Œ, ํ…Œ์ŠคํŠธ์šฉ์œผ๋กœ๋งŒ)
			session.connect();
			executeCommand(session, "ls -l");
		} catch (Exception e) {
			// error handling
		} finally {
			if (session != null) {
				session.disconnect();
			}
		}
	}

	private static void executeCommand(Session session, String command) throws IOException, JSchException {
		ChannelExec channel = (ChannelExec) session.openChannel("exec"); // sftp ์ฑ„๋„ ์ƒ์„ฑ
		channel.setCommand(command);

		ByteArrayOutputStream outputBuffer = new ByteArrayOutputStream();
		ByteArrayOutputStream errorBuffer = new ByteArrayOutputStream();

		InputStream in = channel.getInputStream();
		InputStream err = channel.getExtInputStream();

		channel.connect();

		byte[] temp = new byte[1024];
		while (true) {
			while (in.available() > 0) {
				int i = in.read(temp, 0, 1024);
				if (i < 0) {
					break;
				}
				outputBuffer.write(temp, 0, i);
			}

			while (err.available() > 0) {
				int i = err.read(temp, 0, 1024);
				if (i < 0) {
					break;
				}
				errorBuffer.write(temp, 0, i);
			}

			if (channel.isClosed()) {
				if ((in.available() > 0) || err.available() > 0) {
					continue;
				}
				System.out.println("exit-status: " + channel.getExitStatus());
				break;
			}
			try {
				Thread.sleep(1000);
			} catch (Exception e) {
			}
		}

		String output = outputBuffer.toString("UTF-8");
		String error = errorBuffer.toString("UTF-8");

		if (output != null && output.length() > 0)
			System.out.println("output: " + output);
		if (error != null && error.length() > 0)
			System.out.println("error: " + error);

		channel.disconnect();
	}
}

 

 

๊ณต์‹ ์˜ˆ์ œ๋Š” http://www.jcraft.com/jsch/examples/Exec.java.html ← ์—ฌ๊ธฐ์„œ ๋” ์ฐพ์•„๋ณผ ์ˆ˜ ์žˆ๋‹ค.

'Java' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Java] ๋ถ€๋™์†Œ์ˆ˜์  ์˜ค์ฐจ ๊ด€๋ฆฌํ•˜๊ธฐ  (0) 2024.05.16
[Java] BitSet  (0) 2024.04.19