Jaka jest różnica między protokołami SFTP, SCP i FISH?

59

Kiedyś myślałem, że SCP to narzędzie do kopiowania plików przez SSH, a kopiowanie plików przez SSH nazywa się SFTP, który sam jest synonimem FISH.

Ale teraz, gdy szukałem wtyczki Total Commander do tego celu w systemie Windows, zauważyłem, że na jej stronie jest napisane: „Umożliwia dostęp do zdalnych serwerów przez bezpieczny FTP (FTP przez SSH). Wymaga SSH2. To NIE jest to samo jako SCP! ”.

Jeśli to nie to samo, co ja rozumiem?

Ivan
źródło
5
To jest rozszerzenie poprzedniego pytania . (@Ivan: warto byłoby o tym wspomnieć.)
Gilles „SO- przestań być zły”
Zobacz także superuser.com/q/134901/133844
Pere

Odpowiedzi:

57

SFTP nie jest protokołem FTP nad ssh, ale rozszerzeniem protokołu SSH zawartym w SSH2 (i niektórych implementacjach SSH1). SFTP jest protokołem przesyłania plików podobnym do FTP, ale używa protokołu SSH jako protokołu sieciowego (i korzysta z opuszczenia SSH do obsługi uwierzytelniania i szyfrowania).

SCP służy tylko do przesyłania plików i nie może wykonywać innych czynności, takich jak wyświetlanie list zdalnych katalogów lub usuwanie plików, co robi SFTP.

FISH wydaje się być kolejnym protokołem, który może wykorzystywać SSH lub RSH do przesyłania plików.

jsbillings
źródło
11
Warto dodać: jest też FTPS, czyli FTP przez TLS.
mikemaccana
3
@mikemaccana, możesz następnie dodać FTPES, ponieważ istnieje możliwość jawnego używania ftps przez zwykłe połączenie ftp
Kiwy
26

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.txtktó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ą scpplik 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 #RETRpolecenie. 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.
szczupły
źródło
20

Mówiąc prosto:

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
źródło
1
Ale sftpi scpwymaga specjalnych programów po stronie serwera, w przeciwieństwie do FISH, który używa tylko podstawowych uniksowych funkcji w zdalnej powłoce.
imz - Ivan Zachharyaschev,
Zgodnie z opisem FISH, niezwykłą cechą FISH jest to, że nie wymaga on czegoś specjalnego po stronie zdalnej (nie ma programu serwera, takiego jak scpscp lub sftp-server). I rzeczywiście zdarzają się przypadki, gdy zdalna strona jest „ograniczonym” Uniksem, w którym nie można zainstalować tego, co chcesz: do przesyłania plików do Androida przez SSH (przez Wi-Fi) napisałem zestaw skryptów rpush-cat - być może klient FISH działałby. ( tramp-fish.elw Emacsie też może: zwykły klient TRAMP nie działał, ponieważ statnie istniał na Androidzie).
imz - Ivan Zakharyaschev
2
Czy mógłbyś wyjaśnić, w jaki sposób scpjest on potrzebny po stronie serwera, oprócz strony klienta? Dzięki szybkiemu wyszukiwaniu w Google nie mogłem znaleźć niczego, co potwierdza, że scpjest to również potrzebne po stronie serwera.
Johannes Bittner
11

FISH i SFTP są podobne i jak zaobserwowano, oba działają na SSH, SFTP wymaga szczególnego wsparcia i konfiguracji na serwerze SSH w celu ułatwienia transferu, ale jest to nieco bardziej bezpieczne i pozwala SysAdmins na tylko SFTP (w takich sytuacjach FISH wygrał to działa).

FISH wymaga powłoki (na przykład sh / rsh) do skopiowania, a zatem wymaga pełnego dostępu SSH do maszyny, wyobrażam sobie, że trudniej byłoby go zabezpieczyć (nie mogę komentować tego obiektywnie, jak nigdy nie musiałem).

Tam, gdzie to możliwe, polecam SFTP, scp, FISH (w tej kolejności).

Artykuł w Wikipedii FISH

NJ
źródło
Według połączonego opisu niezwykłą cechą FISH jest to, że nie wymaga on czegoś specjalnego po stronie zdalnej (nie ma programu serwera, takiego jak scpscp lub sftp-server). I rzeczywiście zdarzają się przypadki, gdy zdalna strona jest „ograniczonym” Uniksem, w którym nie można zainstalować tego, co chcesz: do przesyłania plików do Androida przez SSH (przez Wi-Fi) napisałem zestaw skryptów rpush-cat - być może klient FISH działałby. ( tramp-fish.elw Emacsie też może: zwykły klient TRAMP nie działał, ponieważ statnie istniał na Androidzie).
imz - Ivan Zakharyaschev