[Java] 자바에서 SFTP / SSH 접속 하기(스프링)

2021-12-28


특정 서버에 접속하여, 원하는 정보를 가져와야 하는 경우가 있다. 이러한 경우 어떻게 해당 서버에 접근하여 정보를 가져오는지 알아보자.


- import

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Properties;

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;

- 예제

	public void sftpTest() {
		String requestContent = "";
		//파일경로
		String fileLocation = "";

		JSch jSch = new JSch();
		Session session;
		ChannelSftp sftp;

		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();

			// sftp 연결
			Channel channel = session.openChannel("sftp");
			channel.connect();

			sftp = (ChannelSftp) channel;

			try {		
				//확인해야 되는 파일명
				String checkFileName= "abc.txt";

				//파일경로 지정
				fileLocation = "/home/abc/";
				sftp.cd(fileLocation);

				//inputstream 파일 정보를 담는다.
				InputStream inputStream = null;
				//요청 파일을 가져온다.
				inputStream = sftp.get(checkFileName);
				try {
					BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));								
					try {
						int count = 0;
						String line = ""; //텍스트 파일 한줄씩 담을 객체
						while(line != null) {
							try {
								line = reader.readLine();
							}catch (Exception e) {
								line = null;
							}
							if(line == null) {break;}//읽을 행이 없으면 종료
							requestContent = line;
							System.out.println("읽은 정보 -> " + requestContent);
						}
					}catch (Exception e) {
						System.out.println(e.toString());
						reader.close();
					}
				}catch (Exception e) {
					System.out.println(e.toString());
					sftp.quit(); //sftp 종료
					session.disconnect(); //세션 종료
				}
			}catch (Exception e) {
				System.out.println(e.toString());
				sftp.quit(); //sftp 종료
				session.disconnect(); //세션 종료
			}
		}catch (Exception e) {
			System.out.println(e.toString());
		}
	}

 

라이브러리는 jsch를 사용했으며, inputStream으로 파일 정보를 한 줄씩 읽어와 받는 코드이다. 사용자 조건에 따라 서버의 ip / port / id / pw / 파일 위치 / 파일명을 변경해야 되며, 해당 서버에 방화벽은 제외시켜야지 정상 접근이 될 것이다.


메인 이미지 출처 : Photo by Arawark chen on Unsplash