FTP, или протокол передачи файлов, был популярным методом незашифрованной передачи файлов между двумя удаленными системами.
SFTP, протокол передачи файлов по SSH, или безопасный протокол передачи файлов, — это отдельный протокол, поддерживающий SSH, который работает схожим образом, но использует защищенное подключение. Его преимуществом является возможность использования защищенного подключения для передачи файлов и просмотра файловой системы как на локальной, так и на удаленной системе.
Практически во всех случаях использование SFTP будет более предпочтительным по сравнению с FTP из-за имеющихся у первого функций безопасности и возможности использования подключения SSH. FTP — это небезопасный протокол, который следует использовать в ограниченных случаях или в сетях, которым вы доверяете.
Хотя 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
или
- ?
После этого в терминале будет выведен список доступных команд:
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'
. . .
Мы познакомимся с некоторыми из команд, который вы видите выше, в следующих разделах.
Мы можем перемещаться по иерархии файлов удаленной системы с помощью ряда команд, которые работают так же, как аналогичные команды оболочки.
Давайте сориентируемся и узнаем, в каком каталоге удаленной системы мы сейчас находимся. Как в стандартном сеансе оболочки, мы можем ввести следующую команду, чтобы получить текущий каталог:
- pwd
OutputRemote working directory: /home/demouser
Мы можем просмотреть содержимое текущего каталога удаленной системы с помощью другой хорошо знакомой команды:
- ls
OutputSummary.txt info.html temp.txt testDirectory
Обратите внимание, что команды в интерфейсе SFTP не являются стандартными командами оболочки и не поддерживают весь их функционал, но они позволяют использовать некоторые из наиболее важных флагов:
- 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
Навигация по удаленной и локальной файловой системе дает ограниченную пользу без возможности передачи файлов между двумя файловыми системами.
При необходимости загрузки файлов с удаленного хоста мы можем воспользоваться следующей командой для выполнения этой задачи:
- 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 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
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 позволяет выполнять набор базовых действий по обслуживанию файлов, которые могут быть полезны при работе с иерархиями файлов.
Например, вы можете изменить владельца файла в удаленной системе с помощью следующей команды:
- chown userID file
Обратите внимание, что, в отличие от системной команды chmod
, используемая SFTP команда не принимает имена пользователей, подставляя вместо этого UID. К сожалению, не существует удобного способа, позволяющего узнать соответствующий UID пользователя в интерфейсе SFTP.
Обойти это ограничение можно следующим образом:
- 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:
. . .
В третьем столбце содержится идентификатор группы, связанной с именем в первом столбце. Именно этот идентификатор мы и ищем.
К счастью, команда chmod
работает в удаленной файловой системе стандартным образом:
- chmod 777 publicFile
OutputChanging mode on /home/demouser/publicFile
Команда для управления локальными разрешениями для файлов отсутствует, но вы можете настроить локальную пользовательскую маску, чтобы любые файлы, скопированные в локальную систему, имели соответствующие разрешения.
Это можно сделать с помощью команды lumask
:
- lumask 022
OutputLocal umask: 022
Теперь все загружаемые стандартные файлы (при условии отсутствия флага -p
) будут иметь разрешения 644.
SFTP позволяет создавать каталоги как для локальных, так и для удаленных систем с помощью команд lmkdir
и mkdir
соответственно. Эти команды работают ожидаемым образом.
Остальные команды для файлов предназначены только для удаленной файловой системы:
- ln
- rm
- rmdir
Эти команды воспроизводят базовое поведение команд, используемых в оболочке. Если вам потребуется выполнить эти действия в локальной файловой системе, помните о том, что вы можете перейти в оболочку, воспользовавшись этой командой:
- !
Или выполните отдельную команду в локальной системе, указав перед командой !
, например, следующим образом:
- !chmod 644 somefile
После завершения работы с сеансом SFTP используйте exit
или bye
для закрытия подключения.
- bye
Хотя SFTP — это простой инструмент, он очень полезен для администрирования серверов и передачи файлов между ними.
Например, вы можете использовать SFTP для предоставления конкретным пользователям возможности для передачи файлов без доступа SSH. Для получения дополнительной информации по этому вопросу ознакомьтесь с нашим руководством по использованию SFTP без доступа к оболочке.
Если вы используете FTP или SCP для передачи данных, SFTP будет отличным способом повышения безопасности обеих решений. Хотя данный протокол не подходит для всех ситуаций, он обладает достаточно гибкостью и заслуживает активного использования.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!
Для новичка самое то!) Если есть возможность переводите еще)