scp, SFTP o rsync: differenze e quale usare

Usa scp per una copia veloce e occasionale, sftp per esplorare un server o quando è permesso solo SFTP, e rsync per sincronizzare cartelle, riprendere trasferimenti grandi o inviare solo ciò che è cambiato. Tutti e tre girano su SSH. Da OpenSSH 9.0, scp usa di default il protocollo SFTP. rsync deve essere installato su entrambe le macchine.

Aggiornata il . Client OpenSSH 10.3 su macOS verso OpenSSH 10.0 su Debian 13 in un container usa e getta.

Un confronto diretto

scpsftprsync
Ideale perUna copia veloceEsplorare, account limitatiSincronizzare cartelle, file grandi
Cosa serve sul serverSSH con il sottosistema SFTP, oppure scp con -OSSH con il sottosistema SFTPSSH e rsync installato
Invia solo le modificheNoNoSì
RipresaNoSì, reget e reputSì, --partial
Opzione per la porta-P 2222-P 2222-e 'ssh -p 2222'

scp

scp file.txt user@server:/tmp/
scp -r folder user@server:/tmp/
scp -P 2222 user@server:/var/log/app.log .

Da OpenSSH 9.0, scp usa il protocollo SFTP e non il vecchio protocollo scp. Lo vedi con scp -v, che stampa Sending subsystem: sftp. Il vantaggio pratico è che i nomi di file con spazi o caratteri speciali non richiedono più il doppio uso degli apici.

Se il server non ha il sottosistema SFTP, la copia fallisce con subsystem request failed on channel 0. Aggiungi -O per usare il vecchio protocollo:

scp -O file.txt user@server:/tmp/

Altri casi, come cartelle, altre porte e due server, sono negli esempi di scp.

sftp

sftp user@server apre una piccola shell con ls, cd, get, put e bye. Funziona su account senza shell, quindi è la scelta usuale per gli utenti limitati. Vedi la configurazione di un utente solo sftp.

Tutti i comandi del prompt sono nell'elenco dei comandi sftp.

Sa riprendere. Dentro sftp, questi comandi continuano un file parziale:

reput big.bin /tmp/big.bin
reget /tmp/big.bin big.bin

Nella nostra prova entrambi hanno terminato partendo da un file parziale, e i checksum corrispondevano all'originale. Per gli script, metti i comandi in un file ed esegui sftp -b commands.txt user@server.

rsync

rsync -av src/ user@server:/srv/app/
rsync -avz -e 'ssh -p 2222' src/ user@server:/srv/app/
rsync -aP big.bin user@server:/tmp/

-a mantiene permessi, date e link e copia le cartelle. -v elenca i file. -z comprime, il che aiuta con i testi su connessioni lente. -P significa --partial --progress.

rsync deve esistere su entrambi i lati. Se manca sul server ottieni:

bash: line 1: rsync: command not found

Lo slash finale

Uno slash alla fine della sorgente cambia il risultato. Abbiamo eseguito entrambe le forme su una cartella src che contiene a.txt:

rsync -a src  user@server:/tmp/noslash/   # creates /tmp/noslash/src/a.txt
rsync -a src/ user@server:/tmp/slash/     # creates /tmp/slash/a.txt

Con lo slash, rsync copia il contenuto della cartella. Senza, copia la cartella stessa. Uno slash sulla destinazione non fa differenza.

Inviare solo ciò che è cambiato

Nella nostra prova un file da 50 MiB è stato inviato una volta, poi sono stati cambiati 4 KiB al suo interno:

  • Primo trasferimento: 52.441.699 byte inviati.
  • Secondo trasferimento: 43.547 byte inviati.

Questo risparmio avviene attraverso una rete. Tra due cartelle sulla stessa macchina, nella nostra prova rsync ha copiato di nuovo tutto il file.

Riprendere

Abbiamo interrotto un trasferimento di quel file con --partial, che ha lasciato 15,4 MB nella destinazione. Eseguendo di nuovo lo stesso comando quei byte sono stati riutilizzati e il resto è stato inviato, e cmp ha trovato il risultato identico all'originale. Senza --partial, rsync rimuove il file parziale quando viene interrotto.

Due trappole

  • rsync può saltare un file modificato. Di default confronta solo dimensione e data di modifica. Nella nostra prima prova la modifica da 4 KiB è avvenuta nello stesso secondo della copia precedente, con la stessa dimensione, e rsync non ha inviato nulla. -c confronta i checksum, al prezzo di leggere ogni file.
  • --delete rimuove i file nella destinazione che non sono nella sorgente. Con un percorso sbagliato possono essere moltissimi file. Aggiungi prima -n per vedere l'elenco: rsync -avn --delete src/ user@server:/srv/app/.

Sui macOS recenti, /usr/bin/rsync può essere openrsync e non l'originale: sul nostro Mac di prova rsync --version ha stampato openrsync: protocol version 29. Le opzioni qui sopra hanno funzionato, ma non ha tutto, quindi controlla l'output di rsync --version se un'opzione viene rifiutata.

Quale scegliere

  • Un file, una volta: scp.
  • Devi prima guardarti intorno, oppure l'account permette solo SFTP: sftp.
  • La stessa cartella più volte, o un file grande su una brutta connessione: rsync.
  • Il tuo editor e i tuoi strumenti locali sui file del server: monta la cartella con sshfs.

Tutti e tre leggono la tua configurazione SSH, quindi una voce Host salva porta e utente. Vedi il file di configurazione SSH.

Domande

SFTP e scp sono la stessa cosa?

No. sftp è un client interattivo per sfogliare e trasferire file, scp un comando di copia in una riga. Da OpenSSH 9.0, scp usa sotto il protocollo SFTP.

rsync è più veloce di scp?

Quando la destinazione ha già una copia vecchia, sì: rsync invia solo le parti cambiate. Nella nostra prova, una modifica di 4 KiB in un file da 50 MiB ha inviato circa 43 KB. Per un file nuovo, entrambi inviano tutto il file.

rsync funziona via SSH?

Sì. Per un percorso remoto rsync si collega con ssh di default, ma rsync deve essere installato anche sul server.

Fonti

Tutte le guide