저작권 안내: 저작권자표시 Yes 상업적이용 No 컨텐츠변경 No

스프링5 입문

JSP 2.3

JPA 입문

DDD Start

인프런 객체 지향 입문 강의


"[팁] j2ssh-maverick를 이용한 SCP + 키이용 파일 복사"에서 SCP 복사를 위해 j2ssh-maverick를 이용했는데, j2ssh-maverick를 이용해서 SFTP 파일 다운로드도 처리했다. 메이븐 의존 설정은 동일하니 이전글을 참고하면 된다.


SFTP로 특정 폴더의 전체 파일을 다운로드받는 코드는 다음과 같다. 아이디, 암호를 이용해서 인증을 처리했는데, 키파일을 이용하고 싶다면 이전글을 참고한다.


String host = "원격서버";

int port = 22;

String remoteUser = "download";


SshClient ssh = null;

try {

    SshConnector con = SshConnector.createInstance();

    ssh = con.connect(new SocketTransport(host, port), remoteUser);

    Ssh2PasswordAuthentication auth = new Ssh2PasswordAuthentication();

    auth.setUsername(remoteUser);

    auth.setPassword(password);

    int authResult = ssh.authenticate(auth);

    if (authResult != SshAuthentication.COMPLETE) {

        throw new RuntimeException("authFail = " + authResult);

    }

    SftpClient sftp = new SftpClient(ssh);

    sftp.setTransferMode(SftpClient.MODE_BINARY);

    FileTransferProgress progress = createFileTransferProgress();

    sftp.copyRemoteDirectory(

            "/home/download/files", // 다운로드할 원격 서버 폴더

            "/data/local/files", // 복사할 파일을 저장할 로컬 폴더 경로

            false, // recursive: true면 하위 폴더까지 포함

            false, // sync: 동기화 여부, true면 원격 폴더에 존재하지 않는 파일을 삭제

            true, // commit: true면 실제 작업을 수행

            progress); // 진척도를 통지받을 객체

    sftp.exit();

} catch (SshException | IOException | SftpStatusException | ChannelOpenException

        | TransferCancelledException e) {

    logger.error("fail to download", e);

    throw new RuntimeException(e);

} finally {

    if (ssh != null)

        try {

            ssh.disconnect();

        } catch (Exception ex) {

        }

}


progress를 생성할 때 사용한 createFileTransferProgress() 메서드는 다음과 같다. FileTransferProgress를 알맞게 구현하면 파일을 얼마나 다운로드했는지 추적할 수 있다.


private FileTransferProgress createFileTransferProgress() {

    return new FileTransferProgress() {

        @Override

        public void started(long bytesTotal, String remoteFile) {

            logger.info("download start: {}", remoteFile);

        }


        @Override

        public void progressed(long bytesSoFar) {

        }


        @Override

        public boolean isCancelled() {

            return false;

        }


        @Override

        public void completed() {

            logger.info("download done");

        }

    };

}


j2ssh-maverick를 사용하면 폴더 뿐만 아니라 개별 파일에 대한 업로드, 다운로드도 처리할 수 있다. j2ssh-maverick가 제공하는 다양한 기능은 https://github.com/sshtools/j2ssh-maverick에서 확인할 수 있다.

Posted by 최범균 madvirus

댓글을 달아 주세요

타 부서에서 이미지 서버로 사용할 장비가 필요하다 해서 다음과 같이 설정했다.

  • 이미지 업로드용 계정 생성 : imageuser
  • 해당 계정의 /images 경로 생성 : /home/imageuser/images
  • 아파치 httpd로 이미지 경로 설정 : /home/imageuser/images
  • imageuser 계정은 ssh 접근 막음
  • imageuser 계정으로 sftp 연결하면, /home/imageuser 를 루트 디렉토리로 인식함
과정을 정리해보면 다음과 같다.

1. imageuser 계정 생성

계정을 생성하고 암호를 설정한다.

$ useradd imageuser
$ passwd imageuser

2. 업로드할 파일을 보관할 디렉토리 생성

imageuser 계정으로 로그인한 뒤 /home/imageuser에 images 디렉토리를 생성한다.

$ su imageuser
$ cd ~
$ mkdir images

3. sshd_config 설정

/etc/ssh/sshd_config 파일의 설정을 변경하고 sshd를 재시작한다.

# imageuser 계정이 sftp로 연결할 수 있게
Subsystem       sftp    internal-sftp

# imageuser 계정이 sftp로 연결한 경우, /home/imageuser를 루트디렉토리로 인식하게 설정
Match User imageuser
        ForceCommand internal-sftp
        ChrootDirectory /home/imageuser

위 설정에서 ChrootDirectory 설정은 /home/imageuser를 루트 디렉토리로 인식하도록 설정한다.

4. 홈디렉토리를 root 소유로 변경하고 접근 권한 변경

Chroot를 적용하기 위해 /home/imageuser를 root 소유로 변경하고 접근 권한을 755로 변경한다.

$ chown root:root /home/imageuser
$ chmod 755 /home/imageuser

http://lists.mindrot.org/pipermail/openssh-unix-dev/2009-May/027651.html

5. imageuser 계정 쉘 접근 차단

/etc/passwd에서 imageuser 계정의 쉘을 /sbin/nologin으로 바꾼다.

imageuser:x:501:501::/home/imageuser:/sbin/nologin


6. sftp로 연결해서 확인

sftp로 연결해서 디렉토리를 확인해보면 /home/imageuser 디렉토리를 루트 디렉토리로 인식하는 것을 알 수 있다.

$ sftp imageuser@imageserver.mycompany.com
imageuser@imageserver.mycompany.com's password: 암호입력
sftp> ls -la
drwxr-xr-x    3 0        0            4096 Jun 17 03:56 .
drwxr-xr-x    3 0        0            4096 Jun 17 03:56 ..
....생략
drwxrwxr-x    4 501      501          4096 Jun 17 08:03 images
sftp> pwd
Remote working directory: /
sftp> 




Posted by 최범균 madvirus

댓글을 달아 주세요