
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 jobper eseguire questo allineamento una volta al giorno mentre sono in pausa.
Sommario
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:
- Lo script di sincronizzazione (
sync_samba.sh) - Il file di configurazione (
samba_sync.conf) - 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.
Commenti recenti