Ho alcuni spazi FTP da tenere sotto backup, ho sempre gestito la cosa tramite macchina Windows e FreeFileSync (processi batch pianificati), o al più con l’aiuto del NAS e ulteriori applicazioni di terze parti, tutto molto bello e al contempo anche troppo diversificato tra le varie cartelle remote da tenere a bada. Ho quindi deciso di spostare tempo fa il tutto su script Bash avviati dal Raspberry Pi (secondo pianificazione crontab
) appoggiandomi a wget
.
Tutto funzionante e preciso, peccato però per la pulizia: ogni file eliminato dalla cartella sorgente (remota) non rispecchiava poi la situazione della cartella locale. Ho dovuto trovare un’alternativa.
L’alternativa che sto provando a percorrere si chiama lftp, è vecchia come la Bibbia (ma correttamente mantenuta) ed è più lenta della messa cantata, ma funziona e tiene in ordine la cartella di destinazione locale, rispecchiando così in tutto e per tutto la sorgente remota. Il pacchetto è disponibile da repository e si installa quindi con un semplice sudo apt-get install lftp
:
pi@raspberrypi:~/Scripts$ sudo apt-get install lftp Lettura elenco dei pacchetti... Fatto Generazione albero delle dipendenze Lettura informazioni sullo stato... Fatto I seguenti pacchetti NUOVI saranno installati: lftp 0 aggiornati, 1 installati, 0 da rimuovere e 0 non aggiornati. È necessario scaricare 601 kB di archivi. Dopo quest'operazione, verranno occupati 1.846 kB di spazio su disco. Scaricamento di:1 http://raspbian.mirror.garr.it/mirrors/raspbian/raspbian stretch/main armhf lftp armhf 4.7.4-1 [601 kB] Recuperati 601 kB in 0s (1.041 kB/s) Selezionato il pacchetto lftp non precedentemente selezionato. (Lettura del database... 176282 file e directory attualmente installati.) Preparativi per estrarre .../lftp_4.7.4-1_armhf.deb... Estrazione di lftp (4.7.4-1)... Elaborazione dei trigger per man-db (2.7.6.1-2)... Configurazione di lftp (4.7.4-1)...
Il resto è “documentazione e necessità“. Costruendo uno script bash che richiami tutto il necessario, puoi pensare di escludere cartelle che non ti servono, chiedere di cancellare i file dalla cartella locale quando non più presenti nella cartella remota (che poi è tutto quello di cui necessitavo). Io ti porto giusto che parte da uno script già pubblicato da Alexandre Plennevaux su Gist:
#!/bin/sh | |
# @author: Alexandre Plennevaux | |
# @description: MIRROR DISTANT FOLDER TO LOCAL FOLDER VIA FTP | |
# | |
# FTP LOGIN | |
HOST='sftp://ftp.domain.com' | |
USER='ftpusername' | |
PASSWORD='ftppassword' | |
# DISTANT DIRECTORY | |
REMOTE_DIR='/absolute/path/to/remote/directory' | |
#LOCAL DIRECTORY | |
LOCAL_DIR='/absolute/path/to/local/directory' | |
# RUNTIME! | |
echo | |
echo "Starting download $REMOTE_DIR from $HOST to $LOCAL_DIR" | |
date | |
lftp -u "$USER","$PASSWORD" $HOST <<EOF | |
# the next 3 lines put you in ftpes mode. Uncomment if you are having trouble connecting. | |
# set ftp:ssl-force true | |
# set ftp:ssl-protect-data true | |
# set ssl:verify-certificate no | |
# transfer starts now... | |
set sftp:auto-confirm yes | |
mirror --use-pget-n=10 $REMOTE_DIR $LOCAL_DIR; | |
exit | |
EOF | |
echo | |
echo "Transfer finished" | |
date |
Le mie modifiche riguardano l’andare a braccetto con un’installazione WordPress e un paio di ulteriori dettagli che ti spiego rapidamente:
#!/bin/sh | |
# @author: Alexandre Plennevaux | |
# @description: MIRROR DISTANT FOLDER TO LOCAL FOLDER VIA FTP | |
HOST='sftp://ftp.domain.com' | |
USER='ftpusername' | |
PASSWORD='ftppassword' | |
REMOTE_DIR='/absolute/path/to/remote/directory' | |
LOCAL_DIR='/absolute/path/to/local/directory' | |
echo | |
echo "Starting download $REMOTE_DIR from $HOST to $LOCAL_DIR" | |
date | |
lftp -u "$USER","$PASSWORD" $HOST <<EOF | |
# the next 3 lines put you in ftpes mode. Uncomment if you are having trouble connecting. | |
# set ftp:ssl-force true | |
# set ftp:ssl-protect-data true | |
set ssl:verify-certificate no | |
set sftp:auto-confirm yes | |
mirror --delete --only-newer --exclude wp-admin/ --exclude wp-includes/ --use-pget-n=10 $REMOTE_DIR $LOCAL_DIR; | |
exit | |
EOF | |
echo | |
echo "Transfer finished" | |
date |
A parte togliere qualche riga di commento che si può evitare di tenere lì (perché le variabili parlano da sole), le modifiche riguardano i parametri con i quali si lancia lftp
:
--delete
permetterà di cancellare i file nella cartella locale se questi non esistono più in quella remota (A sovrascrive sempre B dove A è la cartella remota e B quella locale).--only-newer
permetterà di portare a bordo della cartella locale solo i file aggiornati, lasciando stare quelli rimasti invariati.--exclude
permette di specificare una cartella da ignorare durante il processo di sincronizzazione tra cartella remota e locale. Ne serve uno per ciascuna cartella o tipo di file da ignorare (vedi cyberciti.biz/faq/lftp-command-mirror-x-exclude-files-sub-directory-syntax). Lo si usa per evitare di portarsi via del materiale di cui non hai realmente bisogno. Considerando che le cartellewp-admin
ewp-includes
si possono in qualsiasi momento prendere da qualsiasi pacchetto di installazione di WordPress, direi che non hanno necessità alcuna di prendermi dello spazio di backup.
Il resto può rimanere invariato, ho giusto tolto il cancelletto (quindi il commento) al comando che imposta la verifica del certificato SSL. Se ti stai chiedendo a cosa serve quel --use-pget-n=10
è presto detto, guarda qui: lftp.yar.ru/lftp-man.html.
-P, --parallel[=N] download N files in parallel --use-pget[-n=N] use pget to transfer every single file
Un test dello script modificato e riadattato (l’ho trasformato in funzione e lo richiamo all’interno di uno script Bash che effettua il backup di più spazi FTP) ha portato all’esito positivo sperato. Chiaramente, quando si ha a che fare con molti file (parecchi) il tempo richiesto affinché l’operazione venga portata a termine può diventare importante. Su un ambiente di produzione – come questo blog – sono servite circa due ore e mezza di lavoro, nulla che non si possa programmare durante la notte via cron
.
Domande? Dubbi? Soluzioni alternative che vuoi suggerirmi? L’area commenti è sempre lì a tua completa disposizione :-)
#StaySafe
Credits:
gist.github.com/pixeline/0f9f922cffb5a6bba97a
cyberciti.biz/faq/lftp-command-mirror-x-exclude-files-sub-directory-syntax
laseroffice.wordpress.com/2010/01/25/utilizzare-lftp-per-fare-un-mirroring-delle-directory-con-un-account-ftp
lejubila.net/2008/12/backup-di-siti-ftp-con-lftp
L'articolo potrebbe non essere aggiornato
Questo post è stato scritto più di 5 mesi fa, potrebbe non essere aggiornato. Per qualsiasi dubbio ti invito a lasciare un commento per chiedere ulteriori informazioni! :-)