Protokół SSH tworzy bezpieczny tunel, przez który można przesyłać strumień dwukierunkowy i można go używać do łączenia dowolnych dwóch procesów.
Najbardziej znanymi dwoma procesami byłyby powłoka (na serwerze) i interaktywny emulator terminala (na kliencie). To jest to, czego używasz, gdy ssh do serwera i wpisujesz polecenia po zachęcie powłoki zdalnej.
SCP to transfer plików wykonywany przy użyciu tylko tej powłoki i polecenia zdalnego. W SCP, gdy klient jest podłączony do serwera, a wszystkie uwierzytelnianie i autoryzacja zostały wykonane, klient wysyła do powłoki zdalnej polecenie podobne do scp -f myfile.txt
, które zapisuje zawartość pliku myfile.txt do strumienia (dla klienta do odczytu) lub scp -t myfile.txt
który czyta ze strumienia i zapisuje na myfile.txt.
Zauważysz, że -f i -t (dla „od” i „do”) nie znajdują się na stronach podręcznika scp. Są uważane za wewnętrzne. Istnieje lekki schemat potwierdzania oraz schemat przesyłania katalogów przez zawijanie zawartości pliku w proste nagłówki. Ale w większości przypadków SCP jest podstawową kwestią zapisania bajtów pliku w tunelu SSH, pozwalając SSH radzić sobie ze skomplikowanymi sprawami, takimi jak kompresja i integralność.
SFTP jest znacznie bardziej złożonym protokołem przesyłania plików, który ponownie jest tunelowany przez SSH.
W SFTP zarówno żądania, jak i odpowiedzi są kodowanymi binarnie pakietami o nazwach takich jak „SSH_FXP_OPEN”, „SSH_FXP_STAT”, „SSH_FXP_READ”, „SSH_FXP_DATA”, „SSH_FXP_CLOSE”.
Jedną interesującą cechą protokołu jest to, że polecenia mogą być przetwarzane potokowo, a odpowiedzi mogą występować w dowolnej kolejności. Może to oznaczać, że sesje poświęcają mniej czasu na odpowiedzi i istnieją możliwości optymalizacji jednoczesnych transferów z jednego serwera ze źródłami danych o różnych prędkościach - chociaż nie wiem, do jakiego stopnia wykorzystano te możliwości.
SFTP ma polecenia do wykonywania wielu rzeczy, których SCP nie rozwiązuje; takich jak usuwanie, zmiana nazwy, obcinanie, przenoszenie itp.
Wszystkie szczegóły są dostępne w wersji roboczej IETF .
Warto zauważyć, że nowsze pakiety SSH zastępują scp
plik binarny użytkownika dowiązaniem symbolicznym do pliku binarnego SFTP. Ten SFTP ma wygląd scp, ale pod przykryciem używa protokołu SFTP.
Cytat - O'Reilly SSH: The Secure Shell, The Definitive Guide , sekcja 5.7 „Podsystemy”:
OSTRZEŻENIE: Nie usuwaj wiersza podsystem-sftp z sshd2_config: jest wymagany do działania scp2 i sftp. Wewnętrznie oba programy uruchamiają ssh2 -s sftp w celu wykonania transferu plików.
Ryba to interesujący kawałek historii. Powiedzmy, że chcesz przesyłać pliki przez SSH, ale twój zdalny system nie ma SCP. A może chcesz wykonywać bardziej skomplikowane operacje na plikach niż SCP, ale twój zdalny system nie ma SFTP. Żaden z tych scenariuszy nie jest dziś prawdopodobny, ale kiedy wynaleziono Fish, tak było.
Dlatego twórcy klienta Midnight Commander postanowili stworzyć własne rozwiązanie. Zasadniczo jest podobny do scp, ale jest więcej poleceń. Klient wysyła polecenia wyglądające następująco:
#RETR /some/name
ls -l /some/name | ( read a b c d x e; echo $x ); echo '### 100'; cat /some/name; echo '### 200'
Jeśli rozmawiasz z serwerem Fish, to zinterpretuje to #RETR
polecenie. Jeśli jednak na serwerze zdalnym nie ma zainstalowanego serwera Fish, polecenia zostaną zinterpretowane przez powłokę. Najpierw komentarz, a następnie polecenie, które drukuje informacje o pliku, a następnie zawartość pliku otoczona niektórymi znacznikami.
W efekcie, przy braku scp lub ryby, klient „wyrzucił swój własny” odpowiednik scp - ale może również wysyłać polecenia powłoki w celu zmiany nazwy, przesunięcia, obcięcia itp.
Szczegóły dotyczące ryb znajdują się w źródle Midnight Commander tutaj .
Co to wszystko oznacza z perspektywy użytkownika końcowego?
- starsze implementacje serwera SSH obsługują scp, ale nie SFTP; z nimi nie można używać klienta SFTP
- Użyj SFTP dla wydajności, niezawodności i elastyczności
- Twój klient „scp” może być ukrytym klientem SFTP ( potrzebne cytowanie )
- Ryby mogą być przydatne w niszowych okolicznościach, ale w przeciwnym razie użyj bardziej standardowego SFTP.