Backup con rsync via ssh

Da Linux User Group Scandiano.

rsync è uno strumento affidabile che permette la sincronizzazione del contenuto di due cartelle, quindi perfetto per fare il backup di un server o dei dati personali del vostro PC.

Backup incrementale da una cartella ad un'altra

Con questo semplice script è possibile fare un backup incrementale da "cartella_1" a "cartella_2". La potenza sta nel fatto che rsync attraverso questi comandi controlla il contenuto della prima cartella, ricopia solo i file nuovi o che sono stati modificati e cancella (attravarso l'opzione --delete) quei file che sono stati eliminati da "cartella_1". Si crea quindi un backup mirror, dove alla fine del processo, si avranno due copie esatte.

Rispetto a due risorse raid, dove la sincronizzazione è immediata, quì si ha la possibilità, fino a che non si lancia di nuovo rsync, di mantenere copia dei file non aggiornati; questo diventa molto comodo soprattutto su risorse condivise dove i file vengono "toccati" da molti utenti: nel caso in cui qualcuno cancelli per sbaglio un file importante, si avrà la possibilità di recuperarlo su "cartella_2" prima di rilanciare nuovamente rsync.

#!/bin/bash

rsync -va --delete /media/cartella_1/ /media/cartella_2/ > /var/log/rsync/backup$(date +%Y%m%d%H%M%S).log

#--log-file=/var/log/backup_log

nota: l'opzione --log è commentata perchè in alcune versioni vecchie di rsync l'opzione non esiste e si è ovviato mandando l'output del comando su un file, in questo caso backup$(date +%Y%m%d%H%M%S).log che mantiene data e ora del backup.

Escludere una cartella dal backup

Con l'opzione --exclude è possibile escludere una cartella dal nostro backup. Nell'esempio viene esclusa la cartella nascosta .Trashes.

rsync -va --delete --exclude .Trashes/ /media/cartella_1/ /media/cartella_2/

Se vogliamo aggiungere più esclusioni basta ripetere l'opzione: --exclude .Trash1/ --exclude .Trash2/ --exclude .Trash3/

Oppure ancora più "elegante" è la possibilità di definire in un file tutte le esclusioni: creiamo ad esempio un file chiamato exclude.txt e all'interno metteremo quello che vogliamo escludere dal backup:

.Trash1/
.Trash2/
.Trash3/*.zip

si può usare il carattere "*" per definire più file (in questo caso esclude dalla cartella .Trash3/ solo i file .zip.

Infine basta aggiungere alla nostra riga di rsync l'opzione:

--exclude-from 'exclude.txt'

Rsync e supporti FAT32

Può succedere che, utilizzando rsync su supporti rimovibili formattati con file system FAT32, la copia creata non sia più sincronizzata una volta che il dispositivo viene smontato e rimontato. Per ovviare a questo basta utilizzare l'opzione --modify-window=1 come in questo esempio:

rsync -va --modify-window=1 --delete /home/lug/Musica/ /media/lug/USB/

rsync e ssh

Ecco come abbinare rsync a ssh per salvare la vostra copia di backup su una macchina remota e come schedulare questa attività con cron.

$ rsync -avz -e ssh /this/dir/ remoteuser@remotehost:/remote/dir

rsync è dotato di numerose opzioni che permettono di adattarlo agli usi più diversi. Si rimanda al manuale di rsync per la consultazione delle diverse opzioni. Nel comando riportato sopra, le opzioni -az permetteranno di fare un backup incrementale, comprimendo i dati prima del trasferimento. Volendo è possibile aggiungere l’opzione –delete per avere una copia esatta delle due cartelle. Senza questa opzione, un file cancellato sulla macchina locale verra conservato sul server remoto. L’opzione -v permette di visualizzare le attività svolte nel corso dell’operazione.

Lanciando il comando riportato sopra vi verrà richiesto di inserire la password dell’utente “remoteuser” sul server “remotehost”. Se l’autenticazione avrà successo, rsync copierà il contenuto della cartella /this/dir nella cartella /remote/dir. Nel caso sia già stato eseguito il comando in precedenza, rsync copierà solo le modifiche.

Utilizzare una porta diversa

Per utilizzare rsync/ssh attraverso una porta diversa dalla 22 uno dei metodi è specificare la porta nuova (in questo caso 14000) in questo modo:

rsync -avz -e "ssh -p 14000" /this/dir/ remoteuser@remotehost:/remote/dir

Riprendere un download interrotto

Con il comando sotto è possibile utilizzare rsync e ssh per riprendere la copia di file tra due host che è stata precedentemente interrotta. Molto comodo quando si trasferisce o si copia un file molto grande con connessioni di rete lente. La copia riprenderà dal punto del file in cui si è interrotta. L'opzione che permette questo è -P (dal man: The -P option is equivalent to --partial --progress)

rsync -Pavze ssh user@remotehost:/remotedir/remotefile /home/user/localdir

In questo esempio copiamo il file "remotefile" da remotehost nella cartella "localdir" locale.

Connessione ssh senza password

Vediamo ora come fare in modo che, effettuando una connessione ssh dalla macchina locale al “remotehost” utilizzando l’utente “remoteuser”, non non venga richiesta la password. Ovviamente non è il massimo della sicurezza, ma è sempre meglio che scrivere la password in linea nel comando.

Per prima cosa generiamo una coppia di chiavi di autenticazione sulla macchina locale con il comando seguente (nel momento in cui sarà richiesta una password non inseriamo nulla).

$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/mio_utente/.ssh/id_rsa):
Created directory ‘/home/mio_utente/.ssh’.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/mio_utente/.ssh/id_rsa.
Your public key has been saved in /home/mio_utente/.ssh/id_rsa.pub.
The key fingerprint is:
2f:3e:09:4f:5e:79:5h:8c:2a:ad:f5:32:41:ac:17:e2 mio_utente@pclocale

Oppure possiamo creare una chiave a crittografia ellittica più sicura e più corta:

$ ssh-keygen -t ecdsa

Con questo comando, nella directory /home/mio_utente/.ssh sono state create due chiavi: una pubblica id_rsa.pub e una privata id_rsa (o id_ecdsa e id_ecdsa.pub nel caso si utilizzi ecdsa). E’ importante verificare che la chiave privata sia accessibile solo per il proprietario:

$ ls -la /home/mio_utente/.ssh
-rw——- 1 root root 1675 Jan 7 15:54 id_rsa
-rw-r–r– 1 root root 395 Jan 7 15:54 id_rsa.pub

A questo punto occorre aggiungere la chiave pubblica al “remotehost” per l’utente “remoteuser”.

$ cat ~/.ssh/id_rsa.pub | ssh remoteuser@remotehost 'cat >> .ssh/authorized_keys'

Se sul server remoto non esiste la cartella .ssh allora dobbiamo crearla manualmente e riprovare a lanciare il comando sopra. Se tutto va bene la connessione fra il computer locale e il “remotehost” avverrà, per l’utente “remoteuser”, senza la richiesta della password.

Automatizziamo il backup

Non resta che schedulare il nostro backup con cron. La configurazione è semplicissima. Basta editare il file /etc/cronttab

00 13 * * * mio_utente  rsync -avz -e ssh /this/dir/ remoteuser@remotehost:/remote/dir

In questo caso il backup sarà eseguito in automatico ogni giorno alle 13 dall’utente “mio_utente”. I dati della directory /this/dir/ saranno salvati nella cartella /remote/dir del server “remotehost”.

Buon backup.