2024-02-06 : 우분투 컨테이너에 SFTP 설정해서 Java 로 접속하기

XingXi·2024년 2월 6일
0

기록

목록 보기
15/33

오늘 SpringCloud 로 MSA 비슷하게 구현도 해보고 여러가지 해봤는데
그럼에도 오늘 정말 인상 깊었던 것은 내 개인 서버 SFTP 연결하는 과정이 재밌었다. 일단 까먹기전에 어제 했던 거를 해보려고 한다

1. Dockerfile

FROM ubuntu:20.04

RUN apt-get update \
    && apt-get install -y openssh-server \
    && mkdir /var/run/sshd \
    && echo 'root:9315' | chpasswd \
    && sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config \
    && sed -i 's/#PasswordAuthentication yes/PasswordAuthentication yes/' /etc/ssh/sshd_config \
    && sed -i 's/#X11Forwarding yes/X11Forwarding no/' /etc/ssh/sshd_config \
    && echo "AllowTcpForwarding yes" >> /etc/ssh/sshd_config

EXPOSE 22

CMD ["/usr/sbin/sshd", "-D"]

우분투 20.04 이미지를 사용한다
SFTP 는 SSH 설정과 함께 설정이 가능하다
Root 비밀번호 설정을 9315 로 하고
Root 계정으로 로그인 가능하게 설정을 한다.

2. Dockerfile 을 빌드

docker build -t sftp-server .

t 태그를 사용하여 sftp-server 라는 이름으로 이미지를 빌드

지금 다시 해보니 이런 식으로 빌드가 되는 것을 볼 수 있다.

3. DockerContainer 생성

 docker run -d -p 2222:22 --name sftp-container sftp-server
17f1235137656ada9a5768d9d7be2558149512af3903f7ee70f03e150f6e8d4c

port 번호를 2222 로 설정하여 container 를 생성

4. root 계정으로 접근

sftp -P 2222 root@localhost
The authenticity of host '[localhost]:2222 ([::1]:2222)' can't be established.
ED25519 key fingerprint is SHA256:f23IcbjL18VW9sj/Q52SSpwm9tPweBsMqSKAXkq7FQE.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[localhost]:2222' (ED25519) to the list of known hosts.
root@localhost's password: 
Permission denied, please try again.
root@localhost's password: 
Connected to localhost.
sftp> 

sftp 프로토콜을 선언하여 docker container 에서 설정한 2222 로 root 계정을 사용해서 접근하여 접속 한 것을 볼 수 있다

Java 에서 써보자!

자바는 jar 파일을 받기 귀찮기도 하고 추후에 SFTP 서버를 연결해서
이미지 서버를 구성하기 위해서 SpringBoot 를 사용할 예정이다
사실상 SpringBoot 를 사용한다고 해도 자바처럼 사용할 거지만..

Build.gradle

Java version

plugins {
	id 'java'
	id 'org.springframework.boot' version '3.2.2'
	id 'io.spring.dependency-management' version '1.1.4'
}

dependency

	implementation 'org.springframework.boot:spring-boot-starter-web'
	compileOnly 'org.projectlombok:lombok'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'

	// https://mvnrepository.com/artifact/com.jcraft/jsch
	implementation 'com.jcraft:jsch:0.1.55'
}
  • SpringBoot WEB
  • lombok
  • jcraft
    (여기서 SFTP 를 연결하기 위해서 jcraft 를 사용했다.)
    메이븐레파지토리

사용 예시

package com.file.sftpuse;

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

public class Main {

    private static final String SESSION_CONFIG_STRICT_HOST_KEY_CHECKING = "StrictHostKeyChecking";

    
    public static void main(String[] args) throws JSchException {
        String remote   = "127.0.0.1";
        int    ssh_port = 2222;
        String user     = "root";
        String private_key = "9315";


        JSch jSch = new JSch();
        Session session = jSch.getSession(user, remote, ssh_port);
        session.setConfig(SESSION_CONFIG_STRICT_HOST_KEY_CHECKING,"no");
        session.setPassword(private_key);
        session.connect(15000);


        Channel channel = session.openChannel("sftp");
		channel.connect(15000);

        ChannelSftp sftp = (ChannelSftp) channel;
        try {
            sftp.cd("/home/");
            sftp.put( "/Users/maxxing/Documents/github-repo/PLAY_GROUND/DOCKER/TOTALMD.md","black.md");
                
        } catch (Exception e) {
            System.out.println(e.getLocalizedMessage());
            System.out.println(e.getCause());
        }

        sftp.disconnect();
        channel.disconnect();
        session.disconnect();

    }
}

좀 멍청하게 작성하긴 했는데 이만한 예시도 없는거 같아서
작성했다 그래도 들어갈건 다 들어가있다.
기능을 설명해보면
SFTP 를 사용하여 우분투 컨테이너 안의 home 디렉토리에
/Users/maxxing/Documents/github-repo/PLAY_GROUND/DOCKER/TOTALMD.md 위치의 파일을
black.md이라는 이름으로 저장한 거다.

TOTALMD.md

실행 결과


black.md 라는 이름으로 마크다운 파일이 들어간 것을 확인할 수 있다.

container 에 VIM 을 설치하고 확인해보면

TOTALMD.md 와 같지만 이름만 다른 black.md 파일을 확인할 수 있다.

0개의 댓글