Mirror FTP usando Raspberry Pi e lftp

| |

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.

woman in black top using MacBook
Photo by Christina @ wocintechchat.com on Unsplash

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 cartelle wp-admin e wp-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

Correzioni, suggerimenti? Lascia un commento nell'apposita area qui di seguito o contattami privatamente.
Ti è piaciuto l'articolo? Offrimi un caffè! ☕ :-)

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! :-)

Condividi l'articolo con i tuoi contatti:
Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

0 Commenti
Inline Feedbacks
View all comments