Введение
FTP, протокол передачи файлов, был популярным, незашифрованным методом передачи файлов между двумя удалёнными системами. К 2022 году он был устарел большинством современного программного обеспечения из-за отсутствия безопасности и в основном может использоваться только в устаревших приложениях.
SFTP, что означает Secure File Transfer Protocol, является отдельным протоколом, встроенным в SSH, который может реализовывать команды FTP через безопасное соединение. Обычно он может использоваться как замена в любых контекстах, где все еще требуется FTP-сервер.
Почти во всех случаях SFTP предпочтительнее FTP из-за его базовых безопасностных функций и возможности использования SSH-соединения. FTP – это небезопасный протокол, который следует использовать только в ограниченных случаях или в сетях, которым вы доверяете.
Хотя SFTP интегрирован во многие графические инструменты, в этом руководстве будет показано, как использовать его через его интерактивный интерфейс командной строки.
Как подключиться с помощью SFTP
По умолчанию SFTP использует протокол SSH для аутентификации и установки безопасного соединения. Из-за этого доступны те же методы аутентификации, которые присутствуют в SSH.
Хотя вы можете аутентифицироваться с помощью паролей по умолчанию, мы рекомендуем создать SSH-ключи и передать ваш открытый ключ на любую систему, к которой вам нужен доступ. Это намного безопаснее и может сэкономить вам время в долгосрочной перспективе.
Пожалуйста, обратитесь к этому руководству по настройке SSH-ключей, чтобы получить доступ к вашему серверу, если вы еще этого не сделали.
Если вы можете подключиться к машине с помощью SSH, то вы выполнили все необходимые требования для использования SFTP для управления файлами. Проверьте доступ SSH следующей командой:
Если это работает, выйдите, набрав:
Теперь мы можем установить сеанс SFTP, выполнив следующую команду:
Вы подключитесь к удаленной системе, и ваш приглашение изменится на приглашение SFTP.
Если вы работаете на пользовательском порте SSH (не на порте по умолчанию 22), то вы можете открыть сеанс SFTP следующим образом:
Это подключит вас к удаленной системе через указанный вами порт.
Получение помощи в SFTP
Самая полезная команда для начала изучения – это команда help. Она предоставляет доступ к сводке других команд SFTP. Вы можете вызвать ее, набрав в приглашении любую из этих команд:
или
Это отобразит список доступных команд:
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
Мы можем перемещаться по файловой иерархии удаленной системы, используя несколько команд, которые работают аналогично своим оболочечным аналогам.
Сначала давайте определимся, в каком каталоге мы находимся в настоящее время на удаленной системе. Как и в типичном сеансе оболочки, мы можем ввести следующее, чтобы узнать текущий каталог:
OutputRemote working directory: /home/demouser
Мы можем просмотреть содержимое текущего каталога удаленной системы с помощью еще одной знакомой команды:
OutputSummary.txt info.html temp.txt testDirectory
Обратите внимание, что команды, доступные в интерфейсе SFTP, не являются прямым аналогом типичного синтаксиса оболочки и не такие функциональные. Однако они реализуют некоторые из наиболее важных дополнительных флагов, таких как добавление -la
к ls
для просмотра дополнительных метаданных и разрешений файла:
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
. . .
Чтобы перейти в другой каталог, мы можем выполнить эту команду:
Теперь мы можем перемещаться по удаленной файловой системе, но что, если нам нужен доступ к нашей локальной файловой системе? Мы можем направить команды к локальной файловой системе, предварив их символом l
для локальной.
Все обсуждаемые до сих пор команды имеют локальные эквиваленты. Мы можем вывести рабочий каталог локально:
OutputLocal working directory: /Users/demouser
Мы можем перечислить содержимое текущего каталога на локальной машине:
OutputDesktop local.txt test.html
Documents analysis.rtf zebra.html
Мы также можем изменить каталог, с которым мы хотим взаимодействовать на локальной системе:
Передача файлов с использованием SFTP
Если мы хотим загрузить файлы с нашего удаленного хоста, мы можем сделать это, используя команду get
:
OutputFetching /home/demouser/remoteFile to remoteFile
/home/demouser/remoteFile 100% 37KB 36.8KB/s 00:01
Как видите, по умолчанию команда get
загружает удаленный файл в файл с тем же именем в локальной файловой системе.
Мы можем скопировать удаленный файл под другим именем, указав имя после этого:
Команда get
также принимает некоторые флаги опций. Например, мы можем скопировать каталог и все его содержимое, указав рекурсивный параметр:
Мы можем указать SFTP сохранять соответствующие разрешения и времена доступа, используя флаг -P
или -p
:
Передача локальных файлов на удаленную систему
Передача файлов на удаленную систему работает таким же образом, но с помощью команды put
:
OutputUploading localFile to /home/demouser/localFile
localFile 100% 7607 7.4KB/s 00:00
Те же флаги, которые работают с get
, применимы и к put
. Так что для копирования всего локального каталога вы можете выполнить put -r
:
Один из знакомых инструментов, полезный при загрузке и выгрузке файлов, – это команда df
, которая работает аналогично версии для командной строки. С ее помощью можно проверить, достаточно ли места для завершения интересующих вас передач:
Output Size Used Avail (root) %Capacity
19.9GB 1016MB 17.9GB 18.9GB 4%
Обратите внимание, что нет локальной версии этой команды, но мы можем обойти это, выполнив команду !
.
Команда !
переводит нас в локальную оболочку, где мы можем запускать любые команды, доступные на нашей локальной системе. Мы можем проверить использование диска, набрав:
а затем
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, введите:
Теперь вы должны увидеть возврат к приглашению SFTP.
Простые операции с файлами в SFTP
SFTP позволяет выполнять некоторые виды управления файловой системой. Например, вы можете изменить владельца файла на удаленной системе с помощью:
Обратите внимание, что, в отличие от системной команды chmod
, команда SFTP не принимает имена пользователей, а использует UID. К сожалению, нет встроенного способа узнать соответствующий UID из интерфейса SFTP.
В качестве временного решения вы можете прочитать из файла /etc/passwd
, который связывает имена пользователей с UID в большинстве сред Linux:
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 будет находиться в третьем столбце файла, разделенном символами двоеточия.
Аналогично, мы можем изменить владельца группы файла с помощью:
Снова нет встроенного способа получить список групп на удаленной системе. Мы можем обойти это с помощью следующей команды:
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 работает как обычно в удаленной файловой системе:
OutputChanging mode on /home/demouser/publicFile
Нет эквивалентной команды для изменения прав доступа к локальному файлу, но вы можете установить локальный umask, чтобы любые скопированные на локальную систему файлы имели соответствующие права доступа.
Это можно сделать с помощью команды lumask
:
OutputLocal umask: 022
Теперь все обычные файлы, загруженные (пока не используется флаг -p
), будут иметь права 644.
SFTP также позволяет создавать каталоги как на локальной, так и на удаленной системе с помощью lmkdir
и mkdir
соответственно.
Остальные команды файла направлены только на удаленную файловую систему:
Эти команды воспроизводят основное поведение их аналогов оболочки. Если вам нужно выполнить эти действия в локальной файловой системе, помните, что вы можете перейти в оболочку, выполнив эту команду:
Или выполните одну команду на локальной системе, предварив команду символом !
, как показано ниже:
Когда вы закончите с сеансом SFTP, используйте exit
или bye
, чтобы закрыть соединение.
Вывод
Хотя синтаксис SFTP гораздо менее обширен, чем современные средства оболочки, он может быть полезен для обеспечения совместимости с устаревшим синтаксисом FTP или для ограничения доступных функций для удаленных пользователей в некоторых средах.
Например, вы можете использовать SFTP, чтобы разрешить определенным пользователям передавать файлы без доступа по SSH. Для получения дополнительной информации о этом процессе ознакомьтесь с нашим руководством по Как включить SFTP без доступа к оболочке.
Если вы привыкли использовать FTP или SCP для передачи данных, SFTP – хороший способ использовать преимущества обоих. Хотя он не подходит для каждой ситуации, это гибкий инструмент, который полезно иметь в вашем арсенале.