SFTP를 사용하여 원격 서버와 파일을 안전하게 전송하는 방법
소개
파일 전송 프로토콜인 FTP는 두 원격 시스템 간에 파일을 전송하는 암호화되지 않은 대중적인 방법이었습니다. 2022년 현재 보안 부족으로 인해 대부분의 최신 소프트웨어에서 더 이상 사용되지 않으며 대부분 레거시 애플리케이션에서만 사용할 수 있습니다.
Secure 파일 전송 프로토콜을 나타내는 SFTP는 보안 연결을 통해 FTP 명령을 구현할 수 있는 SSH에 내장된 별도의 프로토콜 패키지입니다. 일반적으로 FTP 서버가 여전히 필요한 모든 컨텍스트에서 드롭인 교체 역할을 할 수 있습니다.
거의 모든 경우에 기본 보안 기능과 SSH 연결에 피기백할 수 있는 기능 때문에 SFTP가 FTP보다 선호됩니다. FTP는 제한된 경우나 신뢰할 수 있는 네트워크에서만 사용해야 하는 안전하지 않은 프로토콜입니다.
SFTP는 많은 그래픽 도구에 통합되어 있지만 이 가이드에서는 대화형 명령줄 인터페이스를 통해 SFTP를 사용하는 방법을 보여줍니다.
SFTP와 연결하는 방법
기본적으로 SFTP는 SSH 프로토콜을 사용하여 보안 연결을 인증하고 설정합니다. 이로 인해 SSH에 있는 것과 동일한 인증 방법을 사용할 수 있습니다.
기본적으로 비밀번호로 인증할 수 있지만 SSH 키를 생성하고 공개 키를 액세스해야 하는 시스템으로 전송하는 것이 좋습니다. 이것은 훨씬 더 안전하고 장기적으로 시간을 절약할 수 있습니다.
아직 수행하지 않은 경우 서버에 액세스하기 위해 SSH 키를 설정하려면 이 가이드를 참조하십시오.
SSH를 사용하여 시스템에 연결할 수 있으면 SFTP를 사용하여 파일을 관리하는 데 필요한 모든 필수 요구 사항을 완료한 것입니다. 다음 명령을 사용하여 SSH 액세스를 테스트합니다.
- ssh sammy@your_server_ip_or_remote_hostname
작동하면 다음을 입력하여 종료합니다.
- exit
이제 다음 명령을 실행하여 SFTP 세션을 설정할 수 있습니다.
- sftp sammy@your_server_ip_or_remote_hostname
원격 시스템에 연결하면 프롬프트가 SFTP 프롬프트로 변경됩니다.
사용자 지정 SSH 포트(기본 포트 22 아님)에서 작업하는 경우 다음과 같이 SFTP 세션을 열 수 있습니다.
- sftp -oPort=custom_port sammy@your_server_ip_or_remote_hostname
그러면 지정된 포트를 통해 원격 시스템에 연결됩니다.
SFTP에서 도움 받기
가장 먼저 배울 수 있는 가장 유용한 명령은 help 명령입니다. 이렇게 하면 다른 SFTP 명령의 요약에 액세스할 수 있습니다. 프롬프트에 다음 중 하나를 입력하여 호출할 수 있습니다.
- help
또는
- ?
그러면 사용 가능한 명령 목록이 표시됩니다.
OutputAvailable 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'
. . .
다음 섹션에서 볼 수 있는 몇 가지 명령을 살펴보겠습니다.
SFTP로 탐색
쉘과 유사하게 작동하는 여러 명령을 사용하여 원격 시스템의 파일 계층 구조를 탐색할 수 있습니다.
먼저 원격 시스템에서 현재 우리가 있는 디렉토리를 찾아 방향을 잡겠습니다. 일반적인 쉘 세션과 마찬가지로 다음을 입력하여 현재 디렉토리를 가져올 수 있습니다.
- pwd
OutputRemote working directory: /home/demouser
또 다른 친숙한 명령을 사용하여 원격 시스템의 현재 디렉터리 내용을 볼 수 있습니다.
- ls
OutputSummary.txt info.html temp.txt testDirectory
SFTP 인터페이스 내에서 사용할 수 있는 명령은 일반적인 셸 구문과 1:1 일치하지 않으며 기능이 풍부하지 않습니다. 그러나 더 많은 파일 메타데이터 및 권한을 보기 위해 ls
에 -la
를 추가하는 것과 같이 더 중요한 선택적 플래그 중 일부를 구현합니다.
- ls -la
Outputdrwxr-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
. . .
다른 디렉토리로 이동하려면 다음 명령을 실행할 수 있습니다.
- cd testDirectory
이제 원격 파일 시스템을 탐색할 수 있지만 로컬 파일 시스템에 액세스해야 하는 경우에는 어떻게 해야 합니까? 로컬에 대한 l
을 앞에 붙여 로컬 파일 시스템으로 명령을 보낼 수 있습니다.
지금까지 논의된 모든 명령에는 로컬에 해당하는 명령이 있습니다. 로컬 작업 디렉토리를 인쇄할 수 있습니다.
- lpwd
OutputLocal working directory: /Users/demouser
로컬 머신에 있는 현재 디렉토리의 내용을 나열할 수 있습니다.
- lls
OutputDesktop local.txt test.html
Documents analysis.rtf zebra.html
로컬 시스템에서 상호 작용할 디렉터리를 변경할 수도 있습니다.
- lcd Desktop
SFTP로 파일 전송
원격 호스트에서 파일을 다운로드하려면 get
명령을 사용하면 됩니다.
- get remoteFile
OutputFetching /home/demouser/remoteFile to remoteFile
/home/demouser/remoteFile 100% 37KB 36.8KB/s 00:01
보시다시피 기본적으로 get
명령은 원격 파일을 로컬 파일 시스템의 동일한 이름을 가진 파일로 다운로드합니다.
나중에 이름을 지정하여 원격 파일을 다른 이름으로 복사할 수 있습니다.
- get remoteFile localFile
get
명령은 일부 옵션 플래그도 허용합니다. 예를 들어 재귀 옵션을 지정하여 디렉토리와 그 내용을 모두 복사할 수 있습니다.
- get -r someDirectory
-P
또는 -p
플래그를 사용하여 적절한 권한 및 액세스 시간을 유지하도록 SFTP에 지시할 수 있습니다.
- get -Pr someDirectory
로컬 파일을 원격 시스템으로 전송
파일을 원격 시스템으로 전송하는 것은 동일한 방식으로 작동하지만 put
명령을 사용합니다.
- put localFile
OutputUploading localFile to /home/demouser/localFile
localFile 100% 7607 7.4KB/s 00:00
get
과 함께 작동하는 동일한 플래그가 put
에 적용됩니다. 따라서 전체 로컬 디렉토리를 복사하려면 put -r
을 실행할 수 있습니다.
- put -r localDirectory
파일을 다운로드하고 업로드할 때 유용한 친숙한 도구 중 하나는 명령줄 버전과 유사하게 작동하는 df
명령입니다. 이를 사용하여 관심 있는 전송을 완료하기에 충분한 공간이 있는지 확인할 수 있습니다.
- df -h
Output Size Used Avail (root) %Capacity
19.9GB 1016MB 17.9GB 18.9GB 4%
이 명령의 로컬 변형은 없지만 !
명령을 실행하여 문제를 해결할 수 있습니다.
!
명령은 로컬 시스템에서 사용할 수 있는 모든 명령을 실행할 수 있는 로컬 셸로 우리를 드롭합니다. 다음을 입력하여 디스크 사용량을 확인할 수 있습니다.
- !
그런 다음
- df -h
OutputFilesystem 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 세션으로 돌아가려면 다음을 입력하십시오.
- exit
이제 SFTP 프롬프트가 반환되는 것을 볼 수 있습니다.
SFTP를 사용한 간단한 파일 조작
SFTP를 사용하면 몇 가지 종류의 파일 시스템 하우스키핑을 수행할 수 있습니다. 예를 들어 다음을 사용하여 원격 시스템의 파일 소유자를 변경할 수 있습니다.
- chown userID file
시스템 chmod
명령과 달리 SFTP 명령은 사용자 이름을 허용하지 않고 대신 UID를 사용합니다. 안타깝게도 SFTP 인터페이스 내에서 적절한 UID를 알 수 있는 기본 제공 방법이 없습니다.
해결 방법으로 대부분의 Linux 환경에서 사용자 이름을 UID와 연결하는 /etc/passwd
파일에서 읽을 수 있습니다.
- get /etc/passwd
- !less passwd
Outputroot: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는 콜론 문자로 구분된 파일의 세 번째 열에 있습니다.
마찬가지로 다음을 사용하여 파일의 그룹 소유자를 변경할 수 있습니다.
- chgrp groupID file
다시 말하지만 원격 시스템의 그룹 목록을 가져오는 기본 제공 방법은 없습니다. 다음 명령으로 이를 해결할 수 있습니다.
- get /etc/group
- !less group
Outputroot: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 명령은 원격 파일 시스템에서 정상적으로 작동합니다.
- chmod 777 publicFile
OutputChanging mode on /home/demouser/publicFile
로컬 파일 권한을 조작하기 위한 동등한 명령은 없지만 로컬 umask를 설정하여 로컬 시스템에 복사된 모든 파일이 해당 권한을 갖도록 할 수 있습니다.
lumask
명령으로 수행할 수 있습니다.
- lumask 022
OutputLocal umask: 022
이제 다운로드된 모든 일반 파일(-p
플래그가 사용되지 않는 한)은 644 권한을 갖게 됩니다.
SFTP를 사용하면 각각 lmkdir
및 mkdir
을 사용하여 로컬 및 원격 시스템 모두에 디렉토리를 생성할 수 있습니다.
나머지 파일 명령은 원격 파일 시스템만 대상으로 합니다.
- ln
- rm
- rmdir
이러한 명령은 해당 셸의 핵심 동작을 복제합니다. 로컬 파일 시스템에서 이러한 작업을 수행해야 하는 경우 다음 명령을 실행하여 셸에 들어갈 수 있음을 기억하십시오.
- !
또는 다음과 같이 명령 앞에 !
를 붙여 로컬 시스템에서 단일 명령을 실행합니다.
- !chmod 644 somefile
SFTP 세션이 끝나면 exit
또는 bye
를 사용하여 연결을 닫습니다.
- bye
결론
SFTP 구문은 최신 셸 도구보다 훨씬 덜 포괄적이지만 레거시 FTP 구문과의 호환성을 제공하거나 일부 환경의 원격 사용자가 사용할 수 있는 기능을 신중하게 제한하는 데 유용할 수 있습니다.
예를 들어 SFTP를 사용하여 특정 사용자가 SSH 액세스 없이 파일을 전송할 수 있도록 할 수 있습니다. 이 프로세스에 대한 자세한 내용은 셸 액세스 없이 SFTP를 활성화하는 방법에 대한 자습서를 확인하십시오.
전송을 수행하기 위해 FTP 또는 SCP를 사용하는 데 익숙하다면 SFTP는 두 가지의 장점을 모두 활용할 수 있는 좋은 방법입니다. 모든 상황에 적합하지는 않지만 레퍼토리에 포함할 수 있는 유연한 도구입니다.