В чем разница между протоколами SFTP, SCP и FISH?

59

Раньше я думал, что SCP - это инструмент для копирования файлов по SSH, а копирование файлов по SSH называется SFTP, что само по себе является синонимом FISH.

Но теперь, когда я искал плагин Total Commander для этого в Windows, я заметил, что на его странице написано: «Разрешает доступ к удаленным серверам через безопасный FTP (FTP через SSH). Требуется SSH2. Это НЕ то же самое». как SCP! ».

Если это не то же самое, тогда что я неправильно понимаю?

Иван
источник
5
Это продолжение предыдущего вопроса . (@Ivan: было бы полезно упомянуть об этом.)
Жиль "ТАК - перестань быть злым"
См. Также superuser.com/q/134901/133844
Pere

Ответы:

57

SFTP - это не протокол FTP через ssh, а расширение протокола SSH, включенного в SSH2 (и некоторые реализации SSH1). SFTP - это протокол передачи файлов, похожий на FTP, но использующий протокол SSH в качестве сетевого протокола (и выигрыш от использования SSH для обработки аутентификации и шифрования).

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

FISH представляется еще одним протоколом, который может использовать SSH или RSH для передачи файлов.

jsbillings
источник
11
Стоит добавить: есть также FTPS, то есть FTP поверх TLS.
mikemaccana
3
@mikemaccana, затем вы можете добавить FTPES, ведь это возможность явно использовать ftps через обычное соединение ftp
Kiwy
26

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

Наиболее знакомые два процесса - это оболочка (на сервере) и эмулятор интерактивного терминала (на клиенте). Это то, что вы используете, когда вы подключаетесь к серверу и вводите команды в командной строке удаленной оболочки.

SCP - это передача файлов с использованием только этой оболочки и удаленной команды. В SCP, когда клиент подключен к серверу и все аутентификации и авторизации выполнены, клиент отправляет удаленной оболочке команду, подобную scp -f myfile.txtкоторой просто записывает содержимое файла myfile.txt в поток (для клиента читать) или scp -t myfile.txtкоторый читает из потока и пишет в myfile.txt.

Вы заметите, что -f и -t (для "from" и "to") не находятся в man-страницах scp. Они считаются внутренними. Существует упрощенная схема подтверждения и схема для передачи каталогов путем обертывания содержимого файла в простые заголовки. Но по большей части SCP - это основной вопрос записи байтов файла в туннель SSH, позволяющий SSH иметь дело со сложными вещами, такими как сжатие и целостность.

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

В SFTP и запросы, и ответы представляют собой двоично-кодированные пакеты с именами, такими как «SSH_FXP_OPEN», «SSH_FXP_STAT», «SSH_FXP_READ», «SSH_FXP_DATA», «SSH_FXP_CLOSE».

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

SFTP имеет команды для выполнения многих вещей, которые SCP не рассматривает; например, удаление, переименование, усечение, перемещение и т. д.

Все подробности доступны в проекте IETF .

Стоит отметить, что более новые пакеты SSH заменяют scpдвоичный файл пользователя символической ссылкой на двоичный файл SFTP. Этот SFTP имеет внешний вид scp, но под прикрытием он использует протокол SFTP.

Цитата - O'Reilly SSH: Безопасная оболочка, Полное руководство , раздел 5.7 «Подсистемы»:

ВНИМАНИЕ: Не удаляйте строку подсистемы-sftp из sshd2_config: это требуется для работы scp2 и sftp. Внутри обе программы запускают ssh2 -s sftp для передачи файлов.

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

Поэтому разработчики клиента Midnight Commander приступили к созданию собственного решения. Это похоже на scp в принципе, но есть больше команд. Клиент отправляет команды, которые выглядят так:

 #RETR /some/name
 ls -l /some/name | ( read a b c d x e; echo $x ); echo '### 100'; cat /some/name; echo '### 200'

Если вы разговариваете с рыбным сервером, он интерпретирует #RETRкоманду. Однако если на удаленном сервере не установлен сервер Fish, команды будут интерпретироваться оболочкой. Сначала комментарий, затем команда, которая печатает информацию о файле, а затем содержимое файла, заключенное в некоторые маркеры.

Фактически, в отсутствие scp или fish клиент «свернул» свой собственный scp-эквивалент, но он также может отправлять команды оболочки для переименования, перемещения, усечения и т. Д.

Подробная информация о рыбе находится в источнике Midnight Commander здесь .

Что это все означает с точки зрения конечного пользователя?

  • старые реализации SSH-сервера поддерживают scp, но не SFTP; Вы не можете использовать клиент SFTP с этими
  • Используйте SFTP для производительности, надежности и гибкости
  • Ваш "scp" клиент может быть замаскированным SFTP-клиентом ( требуется цитирование )
  • Рыба может быть полезна в нишевых обстоятельствах, но в противном случае используйте более стандартный SFTP.
стройное
источник
20

Проще говоря:

SFTP = SSH + SFTP-server on server
SCP  = SSH + `scp` on server side
FISH = SSH + `dd` (and some other basic Unix utilities on the server side only) 
C2H2
источник
1
Но sftpи scpтребует специальных программ на стороне сервера, в отличие от FISH, который использует только базовые возможности Unix в удаленной оболочке.
imz - Иван Захарьящев
Согласно описанию FISH, отличительной особенностью FISH является то, что для него не требуется ничего особенного на удаленной стороне (нет серверной программы, как scpдля scp или sftp-server). И вы в самом деле случаи , когда удаленная сторона является «ограниченным» Unix, где вы не можете установить то , что вы хотите: для передачи файлов на Android через SSH (по Wi - Fi), я написал множество rpush-кошачьи скриптов - возможно, клиент FISH будет работать. ( tramp-fish.elв Emacs тоже может: обычный клиент TRAMP не работал, потому что statего не было на Android.)
imz - Иван Захарящев
2
Не могли бы вы уточнить, как scpэто также необходимо на стороне сервера, в дополнение к стороне клиента? При быстром поиске в Google я не смог найти ничего, что подтверждает то, что scpтакже необходимо на стороне сервера.
Йоханнес Биттнер,
11

FISH и SFTP похожи, и, как видно, обе они работают по SSH, SFTP требует специальной поддержки и конфигурации на SSH-сервере для облегчения передачи, но он немного более безопасен и позволяет SysAdmins разрешать только SFTP (в этих ситуациях FISH выиграл не работает).

FISH требуется оболочка (например, sh / rsh) для копирования, и, следовательно, требуется полный SSH-доступ к машине, я бы подумал, что это будет сложнее защитить (я не могу комментировать это объективно, как мне никогда не приходилось).

Где возможно, я бы порекомендовал SFTP, scp, FISH (в таком порядке).

Wikipedia FISH Статья

Нью-Джерси
источник
Согласно связанному описанию, замечательной особенностью FISH является то, что он не требует чего-то особенного на удаленной стороне (нет серверной программы, как scpдля scp или sftp-server). И вы в самом деле случаи , когда удаленная сторона является «ограниченным» Unix, где вы не можете установить то , что вы хотите: для передачи файлов на Android через SSH (по Wi - Fi), я написал множество rpush-кошачьи скриптов - возможно, клиент FISH будет работать. ( tramp-fish.elв Emacs тоже могли: обычный клиент TRAMP не работал, потому что statне было на Android.)
imz - Иван Захарящев