Протокол 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.