Как использовать SFTP для безопасной передачи файлов с удаленным сервером

Введение

FTP, протокол передачи файлов, был популярным, незашифрованным методом передачи файлов между двумя удалёнными системами. К 2022 году он был устарел большинством современного программного обеспечения из-за отсутствия безопасности и в основном может использоваться только в устаревших приложениях.

SFTP, что означает Secure File Transfer Protocol, является отдельным протоколом, встроенным в SSH, который может реализовывать команды FTP через безопасное соединение. Обычно он может использоваться как замена в любых контекстах, где все еще требуется 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

Самая полезная команда для начала изучения – это команда help. Она предоставляет доступ к сводке других команд 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, не являются прямым аналогом типичного синтаксиса оболочки и не такие функциональные. Однако они реализуют некоторые из наиболее важных дополнительных флагов, таких как добавление -la к ls для просмотра дополнительных метаданных и разрешений файла:

  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. К сожалению, нет встроенного способа узнать соответствующий UID из интерфейса SFTP.

В качестве временного решения вы можете прочитать из файла /etc/passwd, который связывает имена пользователей с UID в большинстве сред Linux:

  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 также позволяет создавать каталоги как на локальной, так и на удаленной системе с помощью lmkdir и mkdir соответственно.

Остальные команды файла направлены только на удаленную файловую систему:

  1. ln
  2. rm
  3. rmdir

Эти команды воспроизводят основное поведение их аналогов оболочки. Если вам нужно выполнить эти действия в локальной файловой системе, помните, что вы можете перейти в оболочку, выполнив эту команду:

  1. !

Или выполните одну команду на локальной системе, предварив команду символом !, как показано ниже:

  1. !chmod 644 somefile

Когда вы закончите с сеансом SFTP, используйте exit или bye, чтобы закрыть соединение.

  1. bye

Вывод

Хотя синтаксис SFTP гораздо менее обширен, чем современные средства оболочки, он может быть полезен для обеспечения совместимости с устаревшим синтаксисом FTP или для ограничения доступных функций для удаленных пользователей в некоторых средах.

Например, вы можете использовать SFTP, чтобы разрешить определенным пользователям передавать файлы без доступа по SSH. Для получения дополнительной информации о этом процессе ознакомьтесь с нашим руководством по Как включить SFTP без доступа к оболочке.

Если вы привыкли использовать FTP или SCP для передачи данных, SFTP – хороший способ использовать преимущества обоих. Хотя он не подходит для каждой ситуации, это гибкий инструмент, который полезно иметь в вашем арсенале.

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