Come usare rsync su SSH

Esegui rsync -avz src/ user@server:/srv/app/. rsync usa SSH di default e invia solo ciò che è cambiato. Deve essere installato su entrambe le macchine. Lo slash dopo src/ indica il contenuto della cartella, e senza di esso ottieni /srv/app/src/. Per un'altra porta aggiungi -e "ssh -p 2222". Prima di usare --delete, esegui lo stesso comando con --dry-run.

Aggiornata il . rsync 3.5.0 su Debian 13 tra due container usa e getta.

Il comando da cui partire

rsync -avz src/ user@server:/srv/app/
  • -a copia le cartelle e mantiene permessi, date e link.
  • -v elenca i file trasferiti.
  • -z comprime durante il trasferimento, il che aiuta con i testi su una connessione lenta e aggiunge poco per i file già compressi.

Eseguilo due volte di fila e la seconda volta non elenca nessun file. Cambia un file ed elenca solo quello.

Per scegliere fra i tre strumenti, vedi scp, SFTP o rsync a confronto.

Lo slash finale

Uno slash alla fine della sorgente cambia il risultato. Con una cartella chiamata site:

ComandoRisultato sul server
rsync -a site server:www/www/site/index.html
rsync -a site/ server:www/www/index.html

Uno slash alla fine della destinazione non fa differenza in questo caso.

Porta o chiave diversa

rsync -avz -e "ssh -p 2222" src/ user@server:/srv/app/
rsync -avz -e "ssh -i ~/.ssh/id_work" src/ user@server:/srv/app/

Funziona anche una voce Host nella tua configurazione SSH, ed è più breve: rsync -avz src/ server:/srv/app/.

File grandi: avanzamento e ripresa

rsync -aP big.bin user@server:/tmp/

-P significa --partial --progress. Senza --partial, rsync rimuove un file che non ha finito. Con l'opzione, il file parziale resta e la volta successiva viene riutilizzato. Abbiamo interrotto a metà un trasferimento da 30 MB. Senza --partial sul server non è rimasto nessun file. Con l'opzione ne sono rimasti circa 4 MB, lo stesso rsync -aP ha terminato il lavoro e i checksum delle due copie coincidevano.

--dry-run e --delete

--delete rimuove dalla destinazione i file che non sono nella sorgente. Fai sempre un'anteprima con --dry-run, o -n:

$ rsync -avn --delete site/ server:www2/
sending incremental file list
deleting oldfile
...
total size is 9  speedup is 0.05 (DRY RUN)

Dopo questo il file c'è ancora. Togli -n per farlo davvero.

Tre modi in cui --delete fa danni

  • Una sorgente vuota svuota la destinazione. Una prova a vuoto con una cartella empty/ vuota come sorgente prevedeva di cancellare tutto nella destinazione. Se un mount è fallito e la cartella sorgente è vuota, ottieni proprio questo.
  • Uno slash sbagliato cancella più del previsto. La destinazione viene confrontata con la sorgente come l'hai scritta, quindi con site contro www/, tutto il resto che c'è in www/ viene cancellato.
  • Le esclusioni interagiscono. I file esclusi vengono lasciati in pace a meno che tu non aggiunga --delete-excluded. Nella nostra prova questo ha rimosso debug.log dal server.

Un limite ferma un'esecuzione che cancellerebbe troppo. Termina con codice 25:

$ rsync -a --delete --max-delete=1 empty/ server:www2/
Deletions stopped due to --max-delete limit (2 skipped)

Altre forme utili

OperazioneComando
Scaricarersync -av server:www/ back/
Saltare dei filersync -av --exclude='*.log' site/ server:www/
Vedere cosa cambierebbe e perchérsync -ain site/ server:www/
Creare le cartelle mancanti nella destinazionersync -a --mkpath site/ server:a/b/c/

Senza --mkpath, una destinazione più profonda di una cartella fallisce con mkdir ... failed: No such file or directory.

Errori

Se rsync non è installato sul server, ottieni messaggi come questi, e la soluzione è installarlo lì:

rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: remote command not found (code 127)

Una cartella sorgente che non esiste dà change_dir ... failed: No such file or directory e codice di uscita 23.

Su un Mac

Il comando rsync sul Mac che abbiamo usato è openrsync, che dichiara rsync version 2.6.9 compatible. Ha gestito le opzioni di base qui sopra, ma il suo aiuto non include --mkpath né --append-verify. Se ti servono, installa un rsync più recente con Homebrew.

Domande

rsync via SSH richiede rsync sul server?

Sì. rsync gira su entrambi i lati. Se manca sul server ottieni remote command not found (code 127).

Come uso rsync con un'altra porta SSH?

Passa il comando ssh con -e, per esempio rsync -avz -e "ssh -p 2222" src/ user@server:/srv/app/, oppure imposta la porta in una voce Host di ~/.ssh/config.

Cosa significa la barra finale in rsync?

Sulla sorgente, src/ copia il contenuto della cartella e src copia la cartella stessa. Sulla destinazione non cambia nulla.

Fonti

Altro in SFTP e trasferimento file

Tutte le guide