Sicnronizzare due directory su due computer con rsync

sync come strumento di sincroizzazione tra archivi

Utilizzo intercambiabilmente due PC e preferisco mantenere in locale (non su cloud) i contentuti di due directory, per maggior sicurezza.

Nell’ambito di una qualsiasi rete locale in cui collego i due pc voglio che una volta al giorna queste irectory vengano sincronizzate.

Solitamente utilizzo Samba per collegare la directory di PC1 montandola in PC2. L’uso di GVFS però non consente a rsync di lavorare bene perché non riesce la gestione dei diritti di accesso dei file.

Ho superato questo problema smontando la direcory remota e rimontandola a mano con mount.

Quindi le tre operazioni da fare sono:

  • montare in PC2 la directory /home/marcob/clienti/#PC1
  • lanciare rsync
  • creare un cron job per eseguire questo allineamento una volta al giorno mentre sono in pausa.

rsync versione 1

#!/bin/bash
sudo mount -t cifs //10.1.23.245/sambashare /mnt/sambashare -o username=marcob,password=XXXXX,uid=$(id -u),gid=$(id -g),file_mode=0777,dir_mode=0777
rsync -av --progress /home/marco/Documenti/clienti/ /mnt/sambashare/clienti/

Ora però non voglio specificare l’indirizzo IP, preferendo affidarmi piuttosto al DNS (o al file /etc/hosts), in modo tale che lo script funzioni indipendentemente dalla rete in cui mi trovo.

Una seconda tecnica che voglio utilizzare è quella dei secrets in mofdo tale che le informazioni riservate come le credensiali di accesso non siano scritte nello script ma vengano lette da un file locale di configurazione accessibile solo al processo.

La terza cosa che desidero è che tutti i parametri non sensibii siano scitti un un secondo file di configurazione.

rsync ersione finale

La versione finale avrà dunque tre file principali:

  1. Lo script di sincronizzazione (sync_samba.sh)
  2. Il file di configurazione (samba_sync.conf)
  3. Il file dei secrets (/etc/samba/sync_credentials)

Creazione del file di configurazione

Crea un file chiamato samba_sync.conf per definire i parametri di montaggio e sincronizzazione:

# File di configurazione: samba_sync.conf

# Nome host o IP della condivisione Samba
SERVER="js"

# Nome della condivisione Samba
SHARE="sambashare"

# Directory di mount
MOUNT_POINT="/mnt/sambashare"

# Percorso locale dei file da sincronizzare
LOCAL_PATH="/home/marco/Documenti/clienti/"

# Percorso remoto nella condivisione Samba
REMOTE_PATH="clienti/"

# Versione del protocollo SMB (modificabile se necessario)
SMB_VERSION="3.0"

# Percorso del file dei secrets (non deve essere leggibile da altri utenti!)
CREDENTIALS_FILE="/etc/samba/sync_credentials"

Salvo questo file nella directory /etc/samba/ così posso condividerlo tra più script.


Creazione del file dei secrets (per sicurezza)

Creiamo il file /etc/samba/sync_credentials per contenere le credenziali:

username=marcob
password=XXXXX

Salvo con permessi restrittivi per evitare che altri utenti possano leggerlo:

sudo chmod 600 /etc/samba/sync_credentials

Script di sincronizzazione (sync_samba.sh)

Ora creiamo lo script sync_samba.sh per montare, sincronizzare e smontare la condivisione.

#!/bin/bash

# Carica il file di configurazione
CONFIG_FILE="$(dirname "$0")/samba_sync.conf"
if [ ! -f "$CONFIG_FILE" ]; then
    echo "Errore: File di configurazione '$CONFIG_FILE' non trovato!"
    exit 1
fi
source "$CONFIG_FILE"

# Controlla che il file delle credenziali esista
if [ ! -f "$CREDENTIALS_FILE" ]; then
    echo "Errore: File delle credenziali '$CREDENTIALS_FILE' non trovato!"
    exit 1
fi

# Controlla se la condivisione è già montata
if mountpoint -q "$MOUNT_POINT"; then
    echo "La condivisione è già montata su $MOUNT_POINT"
else
    echo "Montando la condivisione Samba..."
    sudo mount -t cifs "//$SERVER/$SHARE" "$MOUNT_POINT" -o credentials="$CREDENTIALS_FILE",uid=$(id -u),gid=$(id -g),file_mode=0777,dir_mode=0777,vers=$SMB_VERSION
    if [ $? -ne 0 ]; then
        echo "Errore: Impossibile montare la condivisione Samba."
        exit 1
    fi
fi

# Esegue la sincronizzazione con rsync
echo "Avvio della sincronizzazione..."
rsync -av --progress "$LOCAL_PATH" "$MOUNT_POINT/$REMOTE_PATH"
if [ $? -eq 0 ]; then
    echo "Sincronizzazione completata con successo."
else
    echo "Errore durante la sincronizzazione!"
    exit 1
fi

# Smonta la condivisione
echo "Smontando la condivisione..."
sudo umount "$MOUNT_POINT"
if [ $? -eq 0 ]; then
    echo "Condivisione smontata correttamente."
else
    echo "Attenzione: impossibile smontare la condivisione!"
    exit 1
fi

Rendiamolo eseguibile:

chmod +x sync_samba.sh

Utilizzo dello script

Ora possiamo eseguire il tuo script in qualsiasi rete, senza bisogno di specificare l’IP:

./sync_samba.sh
...
vpn/fortinet/settings.png
         77.301 100%  208,53kB/s    0:00:00 (xfr#5522, to-chk=9/13473)
vpn/fortinet/test.ods
         15.581 100%   41,92kB/s    0:00:00 (xfr#5523, to-chk=8/13473)
vpn/fortinet/unlicensed.png
         56.307 100%  151,48kB/s    0:00:00 (xfr#5524, to-chk=7/13473)
vpn/fortinet/update_firefox_chrome.txt
            804 100%    2,16kB/s    0:00:00 (xfr#5525, to-chk=6/13473)
vpn/fortinet/version.png
         60.212 100%  132,14kB/s    0:00:00 (xfr#5526, to-chk=5/13473)
vpn/fortinet/vulnus.png
         58.945 100%  100,28kB/s    0:00:00 (xfr#5527, to-chk=4/13473)
vpn/ftp/
vpn/ftp/FileZilla.xml
         13.691 100%   19,46kB/s    0:00:00 (xfr#5528, to-chk=3/13473)
vpn/ftp/connection_refused.png
         15.255 100%   21,62kB/s    0:00:00 (xfr#5529, to-chk=2/13473)
vpn/ftp/connection_refused_da_prometeo.png
        259.856 100%  283,85kB/s    0:00:00 (xfr#5530, to-chk=1/13473)
vpn/girondi/
vpn/girondi/Default.txt
            455 100%    0,50kB/s    0:00:00 (xfr#5531, to-chk=0/13473)
vpn/prova/

sent 3.880.680.485 bytes  received 133.663 bytes  7.166.785,13 bytes/sec
total size is 8.226.028.213  speedup is 2,12
Sincronizzazione completata con successo.
Smontando la condivisione...
Condivisione smontata correttamente.

Voglio ora schedulare l’operazione periodicamente con cron, apriamo crontab:

crontab -e

e aggiungo una riga per eseguire lo script ogni giorno alle 13:

0 13 * * * /usr/local/bin/sync_samba.sh >> /var/log/samba_sync.log 2>&1

Vantaggi di questa soluzione

Sicurezza: Le credenziali sono protette e non visibili nello script.
Flessibilità: Il file di configurazione permette di cambiare i parametri senza modificare lo script.
Automazione: Puoi schedulare l’esecuzione con cron.
Adattabilità: Funziona su diverse reti senza bisogno di cambiare IP.


Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.