Яка різниця між протоколами 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.