원격 서버와 파일을 안전하게 전송하는 데 SFTP를 사용하는 방법

소개

FTP, 파일 전송 프로토콜(File Transfer Protocol)은 두 원격 시스템 간에 파일을 전송하는 인기 있는 비암호화 방법이었습니다. 2022년 기준으로 대부분의 현대 소프트웨어에서 보안 부재로 인해 더 이상 사용되지 않으며 대부분 레거시 응용 프로그램에서만 사용될 수 있습니다.

SFTP, Secure File Transfer Protocol의 약자로, 안전한 연결을 통해 FTP 명령을 실행할 수 있는 SSH에 내장된 별도의 프로토콜입니다. 일반적으로 FTP 서버가 필요한 모든 상황에서 대체할 수 있습니다.

대부분의 경우 SFTP가 기본적으로 FTP보다 선호되며, 그 기본 보안 기능과 SSH 연결에 의존할 수 있는 능력 때문입니다. FTP는 신뢰할 수 있는 네트워크나 제한된 경우에만 사용해야 하는 불안전한 프로토콜입니다.

많은 그래픽 도구에 SFTP가 통합되어 있지만, 이 가이드에서는 대화형 명령 줄 인터페이스를 통해 그 사용법을 보여줄 것입니다.

SFTP로 연결하는 방법

SFTP는 기본적으로 SSH 프로토콜을 사용하여 인증하고 안전한 연결을 설정합니다. 따라서 SSH에서 제공하는 동일한 인증 방법을 사용할 수 있습니다.

비밀번호로 인증할 수는 있지만 기본적으로 SSH 키를 생성하고 공개 키를 액세스해야하는 시스템에 전송하는 것이 좋습니다. 이것이 훨씬 더 안전하며 장기적으로 시간을 절약할 수 있습니다.

이미 하지 않은 경우 SSH 키 설정을 위한 이 가이드를 참조하십시오.

SSH를 사용하여 기계에 연결할 수 있다면 파일을 관리하기 위해 SFTP를 사용할 필요가 있는 모든 필수 요구 사항을 완료한 것입니다. 다음 명령을 사용하여 SSH 액세스를 테스트하십시오:

  1. ssh sammy@your_server_ip_or_remote_hostname

작동하면 다음을 입력하여 빠져 나오십시오:

  1. exit

이제 다음 명령을 사용하여 SFTP 세션을 설정할 수 있습니다:

  1. sftp sammy@your_server_ip_or_remote_hostname

원격 시스템에 연결되고 프롬프트가 SFTP 프롬프트로 변경됩니다.

사용자 정의 SSH 포트에서 작업하는 경우(기본 포트 22가 아님), 다음과 같이 SFTP 세션을 열 수 있습니다:

  1. sftp -oPort=custom_port sammy@your_server_ip_or_remote_hostname

이렇게하면 지정된 포트를 통해 원격 시스템에 연결됩니다.

SFTP에서 도움말 얻기

먼저 배워야 할 가장 유용한 명령은 도움말 명령입니다. 이것은 다른 SFTP 명령의 요약에 액세스를 제공합니다. 프롬프트에 다음 중 하나를 입력하여 호출할 수 있습니다:

  1. help

또는

  1. ?

이렇게하면 사용 가능한 명령 목록이 표시됩니다:

Output
Available commands: bye Quit sftp cd path Change remote directory to 'path' chgrp grp path Change group of file 'path' to 'grp' chmod mode path Change permissions of file 'path' to 'mode' chown own path Change owner of file 'path' to 'own' df [-hi] [path] Display statistics for current directory or filesystem containing 'path' exit Quit sftp get [-Ppr] remote [local] Download file help Display this help text lcd path Change local directory to 'path' . . .

우리는 다음 섹션에서 볼 명령어 몇 가지를 살펴볼 것입니다.

우리는 셸과 유사하게 작동하는 여러 명령어를 사용하여 원격 시스템의 파일 계층 구조를 탐색할 수 있습니다.

먼저 현재 원격 시스템의 디렉토리를 찾아서 우리 자신을 오리엔트 시켜봅시다. 일반적인 셸 세션과 마찬가지로 다음을 입력하여 현재 디렉토리를 얻을 수 있습니다:

  1. pwd
Output
Remote working directory: /home/demouser

우리는 다른 익숙한 명령어로 원격 시스템의 현재 디렉토리 내용을 볼 수 있습니다:

  1. ls
Output
Summary.txt info.html temp.txt testDirectory

주의할 점은 SFTP 인터페이스 내의 명령어가 일반적인 셸 구문과 1:1 대응이 아니며 기능이 풍부하지 않다는 것입니다. 그러나 더 중요한 선택적 플래그를 구현하는 명령어도 있습니다. 예를 들어, ls-la를 추가하여 더 많은 파일 메타데이터와 권한을 볼 수 있습니다:

  1. ls -la
Output
drwxr-xr-x 5 demouser demouser 4096 Aug 13 15:11 . drwxr-xr-x 3 root root 4096 Aug 13 15:02 .. -rw------- 1 demouser demouser 5 Aug 13 15:04 .bash_history -rw-r--r-- 1 demouser demouser 220 Aug 13 15:02 .bash_logout -rw-r--r-- 1 demouser demouser 3486 Aug 13 15:02 .bashrc drwx------ 2 demouser demouser 4096 Aug 13 15:04 .cache -rw-r--r-- 1 demouser demouser 675 Aug 13 15:02 .profile . . .

다른 디렉토리로 이동하려면 이 명령어를 사용할 수 있습니다:

  1. cd testDirectory

이제 원격 파일 시스템을 탐색할 수 있지만, 로컬 파일 시스템에 액세스해야 하는 경우는 어떨까요? 우리는 명령어 앞에 로컬 파일 시스템으로 명령어를 지시할 수 있습니다. l을 로컬 앞에 붙이면 됩니다.

지금까지 논의한 모든 명령에는 로컬 상응물이 있습니다. 로컬 작업 디렉토리를 출력할 수 있습니다:

  1. lpwd
Output
Local working directory: /Users/demouser

로컬 머신의 현재 디렉토리 내용을 나열할 수 있습니다:

  1. lls
Output
Desktop local.txt test.html Documents analysis.rtf zebra.html

또한 로컬 시스템에서 상호 작용할 디렉토리를 변경할 수도 있습니다:

  1. lcd Desktop

SFTP를 사용하여 파일 전송하기

원격 호스트에서 파일을 다운로드하려면 get 명령을 사용할 수 있습니다:

  1. get remoteFile
Output
Fetching /home/demouser/remoteFile to remoteFile /home/demouser/remoteFile 100% 37KB 36.8KB/s 00:01

기본적으로 get 명령은 원격 파일을 로컬 파일 시스템의 동일한 이름의 파일로 다운로드합니다.

파일을 다른 이름으로 복사하려면 이름을 지정한 후에 원격 파일을 복사할 수 있습니다:

  1. get remoteFile localFile

get 명령은 몇 가지 옵션 플래그도 허용합니다. 예를 들어, 재귀 옵션을 지정하여 디렉터리와 해당 내용 전체를 복사할 수 있습니다:

  1. get -r someDirectory

SFTP에게 적절한 권한과 액세스 시간을 유지하도록 하려면 -P 또는 -p 플래그를 사용합니다:

  1. get -Pr someDirectory

로컬 파일을 원격 시스템으로 전송하기

원격 시스템으로 파일을 전송하는 방법은 동일하지만 put 명령을 사용합니다:

  1. put localFile
Output
Uploading localFile to /home/demouser/localFile localFile 100% 7607 7.4KB/s 00:00

get과 동일하게 작동하는 동일한 플래그가 put에 적용됩니다. 따라서 전체 로컬 디렉터리를 복사하려면 put -r을 실행할 수 있습니다:

  1. put -r localDirectory

파일을 다운로드하거나 업로드할 때 유용한 익숙한 도구 중 하나는 명령 줄 버전과 유사하게 작동하는 df 명령입니다. 이를 사용하여 관심 있는 전송을 완료할 충분한 공간이 있는지 확인할 수 있습니다:

  1. df -h
Output
Size Used Avail (root) %Capacity 19.9GB 1016MB 17.9GB 18.9GB 4%

주의하십시오. 이 명령에는 로컬 변형이 없지만, ! 명령을 사용하여 이를 우회할 수 있습니다.

! 명령은 로컬 셸로 이동하게 해주어 로컬 시스템에서 사용 가능한 모든 명령을 실행할 수 있습니다. 디스크 사용량을 확인하려면 다음을 입력하십시오:

  1. !

그런 다음

  1. df -h
Output
Filesystem Size Used Avail Capacity Mounted on /dev/disk0s2 595Gi 52Gi 544Gi 9% / devfs 181Ki 181Ki 0Bi 100% /dev map -hosts 0Bi 0Bi 0Bi 100% /net map auto_home 0Bi 0Bi 0Bi 100% /home

다른 로컬 명령도 예상대로 작동합니다. SFTP 세션으로 돌아가려면 다음을 입력하십시오:

  1. exit

이제 SFTP 프롬프트가 다시 표시됩니다.

SFTP를 사용한 간단한 파일 조작

SFTP를 사용하면 파일 시스템 관리를 할 수 있습니다. 예를 들어, 원격 시스템에서 파일의 소유자를 변경할 수 있습니다:

  1. chown userID file

시스템 chmod 명령과 달리, SFTP 명령은 사용자 이름 대신 UID를 사용합니다. SFTP 인터페이스 내에서 적절한 UID를 알 수 있는 내장된 방법이 없습니다.

대신 대부분의 리눅스 환경에서 사용자 이름과 UID를 연결하는 /etc/passwd 파일을 읽을 수 있습니다.

  1. get /etc/passwd
  2. !less passwd
Output
root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sys:x:3:3:sys:/dev:/bin/sh sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/bin/sh man:x:6:12:man:/var/cache/man:/bin/sh . . .

주의하세요. ! 명령을 그 자체로 주지 않고 로컬 셸 명령의 접두사로 사용한 점에 주목하십시오. 이렇게 하면 로컬 머신에서 사용 가능한 모든 명령을 실행할 수 있으며, 이전에 로컬 df 명령과 함께 사용할 수 있었습니다.

UID는 파일의 세 번째 열에 있으며, 콜론 문자로 구분됩니다.

마찬가지로 파일의 그룹 소유자를 변경할 수 있습니다:

  1. chgrp groupID file

다시 말하지만, 원격 시스템의 그룹 목록을 가져오는 내장된 방법은 없습니다. 다음 명령을 사용하여 이를 해결할 수 있습니다:

  1. get /etc/group
  2. !less group
Output
root:x:0: daemon:x:1: bin:x:2: sys:x:3: adm:x:4: tty:x:5: disk:x:6: lp:x:7: . . .

세 번째 열에는 첫 번째 열의 이름과 관련된 그룹의 ID가 포함됩니다. 이게 바로 우리가 찾는 것입니다.

chmod SFTP 명령은 원격 파일 시스템에서 일반적으로 작동합니다:

  1. chmod 777 publicFile
Output
Changing mode on /home/demouser/publicFile

로컬 파일 권한을 조작하는 동등한 명령은 없지만, 로컬 시스템에 복사된 파일의 해당 권한을 설정할 수 있습니다. 이는 umask를 설정하여 수행할 수 있습니다.

lumask 명령으로 이 작업을 수행할 수 있습니다:

  1. lumask 022
Output
Local umask: 022

이제 모든 일반 파일 다운로드(단, -p 플래그를 사용하지 않는 한)에는 644 권한이 부여됩니다.

SFTP는 또한 로컬 및 원격 시스템에서 디렉토리를 생성할 수 있게 해줍니다. 각각 lmkdirmkdir입니다.

나머지 파일 명령은 모두 원격 파일 시스템에만 적용됩니다:

  1. ln
  2. rm
  3. rmdir

이 명령들은 해당 셸 동등 명령의 핵심 동작을 복제합니다. 이러한 작업을 로컬 파일 시스템에서 수행해야 하는 경우 이 명령을 사용하여 셸로 진입할 수 있습니다:

  1. !

또는 로컬 시스템에서 단일 명령을 실행하려면 명령 앞에 !를 붙이면 됩니다. 다음과 같이:

  1. !chmod 644 somefile

SFTP 세션을 종료하려면 exit 또는 bye를 사용하여 연결을 닫습니다.

  1. bye

결론

SFTP 구문은 현대 쉘 도구보다 훨씬 적지만, 레거시 FTP 구문과의 호환성을 제공하거나 일부 환경의 원격 사용자에게 제한된 기능을 주의 깊게 제한하는 데 유용할 수 있습니다.

예를 들어, 특정 사용자가 SSH 액세스 없이 파일을 전송할 수 있도록 하려면 SFTP를 사용할 수 있습니다. 이 프로세스에 대한 자세한 내용은 쉘 액세스 없이 SFTP 사용하기 튜토리얼을 참조하십시오.

FTP 또는 SCP를 사용하여 전송을 수행하는 것에 익숙한 경우 SFTP를 사용하여 두 가지의 강점을 활용할 수 있습니다. 모든 상황에 적합한 것은 아니지만, 귀하의 레퍼토리에 유연한 도구로써 가치가 있습니다.

Source:
https://www.digitalocean.com/community/tutorials/how-to-use-sftp-to-securely-transfer-files-with-a-remote-server