Il protocollo SSH crea un tunnel sicuro attraverso il quale è possibile trasferire un flusso bidirezionale e è possibile utilizzare quel flusso per connettere qualsiasi due processi desiderati.
I due processi più familiari sarebbero una shell (sul server) e un emulatore di terminale interattivo (sul client). Questo è quello che stai usando quando vai su un server e digiti i comandi al prompt della shell remota.
SCP è il trasferimento di file fatto usando solo quella shell e un comando remoto. In SCP, una volta che il client è collegato al server e tutte le autenticazioni e autorizzazioni sono state eseguite, il client invia alla shell remota un comando simile scp -f myfile.txt
, che scrive semplicemente il contenuto del file myfile.txt sullo stream (per il client da leggere) o scp -t myfile.txt
che legge dallo stream e scrive su myfile.txt.
Noterai che -f e -t (per "da" e "a") non sono nelle manpage di scp. Sono considerati interni. Esiste uno schema di riconoscimento leggero e uno schema per il trasferimento di directory avvolgendo il contenuto del file in semplici intestazioni. Ma per la maggior parte SCP è una questione basilare di scrivere i byte del file sul tunnel SSH, lasciando che SSH gestisca cose complicate come la compressione e l'integrità.
SFTP è un protocollo di trasferimento file molto più complesso, che viene nuovamente sintonizzato tramite SSH.
In SFTP sia le richieste che le risposte sono pacchetti con codifica binaria con nomi come "SSH_FXP_OPEN", "SSH_FXP_STAT", "SSH_FXP_READ", "SSH_FXP_DATA", "SSH_FXP_CLOSE".
Una caratteristica interessante del protocollo è che i comandi possono essere sottoposti a pipeline e le risposte possono arrivare in qualsiasi ordine. Ciò può significare che le sessioni trascorrono meno tempo in attesa di risposte e ci sono opportunità per ottimizzare i trasferimenti simultanei da un server con origini dati di varie velocità, anche se non so fino a che punto sono state colte tali opportunità.
SFTP ha i comandi per fare molte cose che SCP non affronta; come eliminare, rinominare, troncare, spostare, ecc.
Tutti i dettagli sono disponibili in una bozza IETF .
Vale la pena notare che i pacchetti SSH più recenti sostituiscono il file scp
binario dell'utente con un collegamento simbolico al file binario SFTP. Questo SFTP ha l'aspetto di scp, ma sotto le coperte usa il protocollo SFTP.
Citation - O'Reilly SSH: The Secure Shell, The Definitive Guide , sezione 5.7 "Sottosistemi":
ATTENZIONE: Non rimuovere la riga del sottosistema-sftp da sshd2_config: è necessario per far funzionare scp2 e sftp. Internamente, entrambi i programmi eseguono ssh2 -s sftp per eseguire trasferimenti di file.
Il pesce è un pezzo interessante di storia. Supponiamo che tu voglia trasferire file su SSH, ma il tuo sistema remoto non ha SCP. O forse vuoi fare operazioni sui file più sofisticate di SCP, ma il tuo sistema remoto non ha SFTP. Nessuno di questi scenari è probabile oggi, ma quando fu inventato Fish, lo erano.
Quindi gli sviluppatori del client Midnight Commander hanno iniziato a creare la propria soluzione. È simile a scp in linea di principio, ma ci sono più comandi. Il client invia comandi simili a:
#RETR /some/name
ls -l /some/name | ( read a b c d x e; echo $x ); echo '### 100'; cat /some/name; echo '### 200'
Se stai parlando con un server Fish, interpreterà il #RETR
comando. Tuttavia, se sul server remoto non è installato un server Fish, i comandi verranno interpretati dalla shell. Prima un commento, quindi un comando che stampa le informazioni sul file, seguito dal contenuto del file racchiuso in alcuni marcatori.
In effetti, in assenza di scp o fish, il client ha "lanciato il proprio" scp equivalente - ma può anche inviare comandi shell per rinominare, spostare, troncare, ecc.
I dettagli di Fish sono nella fonte del comandante di mezzanotte qui .
Cosa significa tutto ciò dal punto di vista dell'utente finale?
- le precedenti implementazioni di server SSH supportano scp ma non SFTP; non puoi usare un client SFTP con questi
- Utilizzare SFTP per prestazioni, affidabilità e flessibilità
- Il tuo client "scp" potrebbe essere un client SFTP sotto mentite spoglie ( citazione necessaria )
- Il pesce potrebbe essere utile in circostanze di nicchia, ma altrimenti utilizzare l'SFTP più standard.