Site icon Gioxx.org

Mirror FTP usando Raspberry Pi e lftp

Mirror FTP usando RaspberryPi 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.

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:

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:
Exit mobile version