Поиск по сайту:

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


Введение

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

SFTP (Безопасный протокол передачи файлов) — это отдельный протокол, встроенный в 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' . . .

Мы рассмотрим некоторые из команд, которые вы видите в следующих разделах.

Навигация с помощью SFTP

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

Во-первых, давайте сориентируемся, выяснив, в каком каталоге мы сейчас находимся в удаленной системе. Как и в типичном сеансе оболочки, мы можем ввести следующее, чтобы получить текущий каталог:

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

Мы можем просмотреть содержимое текущего каталога удаленной системы с помощью другой знакомой команды:

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

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

Третий столбец содержит идентификатор группы, связанной с именем в первом столбце. Это то, что мы ищем.

Команда SFTP chmod работает в удаленной файловой системе как обычно:

  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 — хороший способ использовать сильные стороны обоих. Хотя это не подходит для каждой ситуации, это гибкий инструмент, который можно иметь в своем репертуаре.