Tutorial

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

Linux Basics

Введение

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

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

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

Хотя 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

Самой полезной командой, с которой нужно познакомиться в первую очередь, является команда вызова справки. Она предоставляет доступ к основной справочной информации SFTP. Вы можете воспользоваться одной из следующих команд:

  • help

или

  • ?

После этого в терминале будет выведен список доступных команд:

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

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

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

  • pwd
Output
Remote working directory: /home/demouser

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

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

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

  • 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 . . .

Чтобы перейти в другой каталог, воспользуйтесь следующей командой:

  • cd testDirectory

Теперь мы можем просматривать удаленную файловую систему, но что если нам потребуется доступ к локальной файловой системе? Мы можем направлять команды непосредственно локальной файловой системе, добавив в начало команды символ l.

Все описанные ранее команды имеют локальные эквиваленты. Мы можем вывести локальный рабочий каталог:

  • lpwd
Output
Local working directory: /Users/demouser

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

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

Также мы можем изменить каталог, с которым хотим работать на локальном компьютере:

  • lcd Desktop

Передача файлов с помощью SFTP

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

Передача удаленных файлов в локальную систему

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

  • get remoteFile
Output
Fetching /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
Output
Uploading localFile to /home/demouser/localFile localFile 100% 7607 7.4KB/s 00:00

Флаги, доступные для команды get, могут применяться и с командой put. Чтобы скопировать всю локальную директорию, вы можете воспользоваться следующей командой:

  • put -r localDirectory

Примечание: в настоящее время в версиях OpenSSH, предоставляемых в текущих версиях Ubuntu (начиная, по крайней мере, с версии 14.04 до версии 15.10), существует баг, который препятствует корректной работе указанной выше команды. При попытке использования команды выше для передачи данных серверу, использующему дефектную версию OpenSSH, вы получите следующую ошибку: Couldn't canonicalise: No such file or directory.

Чтобы обойти эту ошибку, необходимо сначала создать каталог назначения на удаленном сервере с помощью команды mkdir localDirectory. После этого команда выше должна отработать без ошибки.

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

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

Обратите внимание, что локального варианта этой команды нет, но мы можем обойти это ограничение, воспользовавшись ! в качестве команды.

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

  • !

а затем

  • 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, введите:

  • exit

Вы должны увидеть, что приглашение SFTP вернулось.

Простые манипуляции с файлами с помощью SFTP

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

Например, вы можете изменить владельца файла в удаленной системе с помощью следующей команды:

  • chown userID file

Обратите внимание, что, в отличие от системной команды chmod, используемая SFTP команда не принимает имена пользователей, подставляя вместо этого UID. К сожалению, не существует удобного способа, позволяющего узнать соответствующий UID пользователя в интерфейсе SFTP.

Обойти это ограничение можно следующим образом:

  • get /etc/passwd
  • !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 находится в третьей колонке файла и отделяется двоеточием.

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

  • chgrp groupID file

Опять же не существует удобного способа получения списка групп удаленной системы. Мы можем обойти это ограничение с помощью следующей команды:

  • get /etc/group
  • !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: . . .

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

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

  • chmod 777 publicFile
Output
Changing mode on /home/demouser/publicFile

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

Это можно сделать с помощью команды lumask:

  • lumask 022
Output
Local umask: 022

Теперь все загружаемые стандартные файлы (при условии отсутствия флага -p) будут иметь разрешения 644.

SFTP позволяет создавать каталоги как для локальных, так и для удаленных систем с помощью команд lmkdir и mkdir соответственно. Эти команды работают ожидаемым образом.

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

  • ln
  • rm
  • rmdir

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

  • !

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

  • !chmod 644 somefile

После завершения работы с сеансом SFTP используйте exit или bye для закрытия подключения.

  • bye

Заключение

Хотя SFTP — это простой инструмент, он очень полезен для администрирования серверов и передачи файлов между ними.

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

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

Creative Commons License