Linux rsync: Come sincronizzare i file localmente e tramite SSH

rsync è uno strumento che copia file e directory su sistemi locali o remoti e trasferisce le modifiche. Il comportamento predefinito è copiare in una sola direzione dalla sorgente alla destinazione, e i file che esistono solo nella destinazione non vengono eliminati a meno che non sia specificato --delete.

Prima di iniziare

Gli esempi vengono eseguiti nel terminale Linux. Per prima cosa, verifica se è installato con rsync --version. Su Ubuntu, se non è installato, puoi installarlo con il seguente comando. Per i trasferimenti remoti, rsync è richiesto su entrambi i sistemi e, se si utilizza SSH (Secure Shell), sono necessari anche l'accesso remoto e i permessi di scrittura sul percorso di destinazione.

sudo apt update
sudo apt install rsync

Se inserisci i percorsi di origine e destinazione al contrario, puoi sovrascrivere o eliminare i dati desiderati. Prima di gestire dati importanti, assicurati di mettere al sicuro un backup separato e, soprattutto quando usi l'opzione di eliminazione, verifica prima le modifiche previste con --dry-run. La sincronizzazione è diversa da un backup che ripristina un punto precedente, perché errori o corruzioni nella sorgente possono riflettersi anche nella destinazione.

Copia della directory locale e la differenza della barra

Il seguente è un esempio di creazione di una nuova cartella di pratica nella directory home e di preparazione di un file. Se esiste già una cartella con lo stesso nome, usa un nome diverso.

mkdir -p "$HOME/rsync-demo/source" "$HOME/rsync-demo/dest"
printf 'hello\n' > "$HOME/rsync-demo/source/hello.txt"
rsync -av "$HOME/rsync-demo/source/" "$HOME/rsync-demo/dest/"
ls -l "$HOME/rsync-demo/dest/"

Se hello.txt appare nel risultato dell'ultimo comando, il contenuto della directory di origine è stato copiato nella destinazione. Eseguire nuovamente lo stesso comando rsync di solito non trasferisce di nuovo i file ordinari che non sono cambiati. Il confronto di base utilizza la dimensione del file e il tempo di modifica, quindi non è una verifica completa che i contenuti siano gli stessi.

Il / alla fine della sorgente significa che i contenuti all'interno della directory, e non la directory stessa, vengono copiati nella destinazione. Se la directory di destinazione esiste già e ometti la barra, il nome della directory di origine verrà creato sotto la destinazione.

rsync -av "$HOME/rsync-demo/source" "$HOME/rsync-demo/dest/"

Eseguire questo comando creerà dest/source/hello.txt. Il dest/hello.txt creato in precedenza rimarrà così com'è. La differenza tra i due percorsi è particolarmente importante quando si utilizza l'opzione di eliminazione. Se ci sono spazi nel percorso, racchiudilo tra virgolette come nell'esempio.

Opzioni più utilizzate e controlli preliminari

  • -a: Questa è la modalità archivio. Richiede la copia ricorsiva e la conservazione del tempo, dei permessi, del proprietario, del gruppo e dei collegamenti simbolici. La conservazione della proprietà può essere limitata a seconda dei permessi e del supporto del file system di destinazione. Le ACL e gli attributi estesi non sono inclusi in -a.
  • -v: Mostra l'output dettagliato delle operazioni.
  • -n o --dry-run: Mostra le operazioni previste senza apportare effettivamente modifiche.
  • -z: Utilizza la compressione durante il trasferimento. L'efficacia varia a seconda delle condizioni della rete e dei tipi di file e non è sempre necessaria per copie locali.

Ad esempio, puoi controllare come segue prima della copia effettiva. L'output mostra le modifiche previste e, se i file cambiano o si verificano errori tra una prova e l'esecuzione effettiva, il risultato reale potrebbe differire.

rsync -avn "$HOME/rsync-demo/source/" "$HOME/rsync-demo/dest/"

Se hai bisogno di verificare se i file con le stesse dimensioni e data di modifica abbiano effettivamente contenuti diversi, puoi considerare il confronto --checksum, ma può essere costoso poiché entrambi i file vengono letti. Per il significato dettagliato delle opzioni, fai riferimento al manuale ufficiale di rsync.

Eliminazione dei file che esistono solo nella destinazione

--delete elimina gli elementi dalla directory di destinazione della sincronizzazione che non esistono nella sorgente. Se dovessi specificare per errore la destinazione o il livello di directory sbagliato, anche i file necessari potrebbero essere eliminati, quindi verifica prima il percorso di destinazione e la barra finale della sorgente e esamina i risultati di una prova.

L'esempio seguente può elencare gli elementi che esistono solo nella destinazione, come creato sopra da dest/source/, per la cancellazione. Eseguilo solo quando non ci sono file da conservare nella cartella di prova.

rsync -avn --delete "$HOME/rsync-demo/source/" "$HOME/rsync-demo/dest/"

Controlla le voci deleting nell'output e rimuovi -n solo per eseguirlo realmente se l'intervallo di eliminazione è corretto e i backup per il recupero sono pronti.

rsync -av --delete "$HOME/rsync-demo/source/" "$HOME/rsync-demo/dest/"

Questo comando cambia solo la destinazione e non elimina i file dalla sorgente. I file che esistevano solo nella destinazione potrebbero non essere recuperabili senza le procedure di recupero file usuali. Preparate backup di versione separati e la verifica del ripristino per i dati operativi.

Escludere File o Directory

Per escludere la directory cache dalla sorgente dal bersaglio di trasferimento, specificarla come segue. Poiché il contenuto della sorgente è la radice del trasferimento, la barra iniziale si riferisce a cache in quella radice. Per prima cosa, eseguite una prova per assicurarvi che vengano esclusi solo gli elementi desiderati.

rsync -avn --exclude='/cache/' "$HOME/rsync-demo/source/" "$HOME/rsync-demo/dest/"

Se il risultato è corretto, rimuovere -n e copiarlo. La regola di esclusione predefinita protegge generalmente gli elementi di esclusione del destinatario in --delete, ma l'uso di --delete-excluded o la modifica delle regole del filtro possono cambiare il comportamento. Verificare i pattern complessi in una cartella separata prima di applicarli ai dati reali.

Sincronizzare con un server remoto tramite SSH

In un ambiente pronto per l'accesso SSH, il seguente comando invia il contenuto della sorgente locale alla directory di destinazione sul server remoto. Sostituire user, server.example.com e i percorsi con i valori effettivi, e preparare la directory di destinazione remota in anticipo. Al primo collegamento, verificare l'impronta digitale della chiave host del server tramite un canale affidabile.

rsync -avn -e ssh "$HOME/rsync-demo/source/" user@server.example.com:/home/user/backup/

Dopo aver esaminato l'elenco dei trasferimenti previsti, rimuovere -n per il trasferimento. Al contrario, per recuperare dal server remoto alla macchina locale, impostare il percorso remoto come posizione di origine.

rsync -avn -e ssh user@server.example.com:/home/user/backup/ "$HOME/rsync-demo/dest/"

Se la porta SSH differisce da quella predefinita, ad esempio, utilizzare -e 'ssh -p 2222'. Per l'accesso remoto, è consigliabile utilizzare un account con permessi limitati e l'autenticazione tramite chiave SSH. Non inserire direttamente la password nel comando perché potrebbe essere esposta nelle informazioni del processo o nella cronologia della shell; pertanto, l'esempio sshpass -p nell'articolo precedente non viene utilizzato. Nei compiti automatizzati, gestire insieme la protezione della chiave e l'ambito di accesso.