Яка різниця між протоколами SFTP, SCP та FISH?


59

Раніше я вважав, що SCP - це інструмент для копіювання файлів через SSH, а копіювання файлів через SSH називається SFTP, який сам по собі є синонімом FISH.

Але тепер, коли я шукав плагін Total Commander для цього в Windows, я помітив, що на його сторінці написано "Дозволяє доступ до віддалених серверів через захищений FTP (FTP через SSH). Потрібен SSH2. Це НЕ те саме як SCP! ".

Якщо це не те саме, то що я нерозумію?


5
Це розширення попереднього питання . (@Ivan: було б корисно згадати про це.)
— перестань бути злим"

Дивіться також superuser.com/q/134901/133844
— Пере

Відповіді:


57

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

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

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


11
Варто додати: також є FTPS, який є FTP через TLS.
— mikemaccana

3
@mikemaccana ви можете додати FTPES відьма - це можливість використовувати ftps явно через звичайне ftp-з'єднання
— Kiwy

26

Протокол SSH створює захищений тунель, через який ви можете перенести двосторонній потік, і ви можете використовувати цей потік для з'єднання будь-яких двох ваших процесів.

Найвідомішими двома процесами будуть оболонка (на сервері) та інтерактивний емулятор терміналу (у клієнта). Це те, що ви використовуєте, коли ssh на сервер і вводимо команди у відповідь на запит віддаленої оболонки.

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

Ви помітите, що -f і -t (для "від" і "до") не містяться в маніпуляціях 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'

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

Ефективно, за відсутності scp або риби, клієнт "прокатав свій" еквівалент scp - але він може однаково відправляти команди оболонки для перейменування, переміщення, усічення тощо.

Деталі про Риб містяться у джерелі команди півночі командира тут .

Що це все означає з точки зору кінцевого споживача?

  • старіші 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) 

1
Але sftpі scpпотрібні спеціальні програми на стороні сервера, на відміну від FISH, який використовує лише основні утиліти Unix у віддаленій оболонці.
— imz - Іван Захарящев

Згідно з описом FISH, чудовою особливістю FISH є те, що він не вимагає чогось особливого на віддаленій стороні (ніякої серверної програми, як scpдля scp або sftp-сервера). І справді бувають випадки, коли віддаленою стороною є "обмежений" Unix, де ви не можете встановити те, що хочете: для передачі файлів на Android через SSH (через WiFi) я написав набір сценаріїв rpush-cat - можливо, клієнт 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 (у такому порядку).

Стаття про рибку у Вікіпедії


Згідно з пов'язаним описом, чудовою особливістю FISH є те, що він не вимагає чогось особливого на віддаленій стороні (ніякої серверної програми, як scpдля scp або sftp-сервера). І справді бувають випадки, коли віддаленою стороною є "обмежений" Unix, де ви не можете встановити те, що хочете: для передачі файлів на Android через SSH (через WiFi) я написав набір сценаріїв rpush-cat - можливо, клієнт FISH працював би. ( tramp-fish.elв Emacs теж можна було: звичайний клієнт TRAMP не працював, оскільки statйого не було на Android.)
— imz - Іван Захарящев
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.