{{tag>fr fr:linux fr:transfert_de_fichier fr:sauvegarde}} ====== Synchronisation lftp ====== Cette page décrit comment synchroniser un répertoire avec lftp. ===== Installation ===== Installer le paquet lftp. ===== Configuration ===== lftp ne nécessite pas de configuration mais il est possible de simplifier son utilisation avec des bookmark. Utilisation : bookmark [SOUS-COMMANDE] La commande bookmark contrôle les signets Les sous-commandes suivantes sont valides : add [] - ajoute l'url en cours ou l'url indiquée aux signets et l'associe au nom donné del - supprime le signet edit - démarre l'éditeur de signets import - importe un fichier de signets externe list - affiche les signets (par défaut) exemple : lftp :/> bookmark add site.com ftp://user:pass@ftp.site.com lftp :/> bookmark list site.com ftp://user:XXXX@ftp.site.com lftp :/> Il est ensuite possible d'utiliser ces bookmark avec la commande "connect" ou directement à partir de la ligne de commande : lftp site.com ===== Synchronisation manuelle ===== Avant d'automatiser toute synchronisation, il est conseillé de faire quelques tests manuellement.\\ :!: En cas d'erreur, le risque est de supprimer l'ensemble des fichiers sources. La synchronisation est réalisée avec la commande mirror : lftp matthieu@gandalf.bouthors.fr:/> help mirror Utilisation : mirror [OPTS] [distant [local]] Duplique le répertoire distant spécifié vers le répertoire local -c, --continue continue, si c'est possible, un travail de duplication -e, --delete efface les fichiers absents sur le site distant --delete-first efface les anciens fichiers avant d'en transférer de nouveaux -s, --allow-suid duplique aussi les bits suid/sgid --allow-chown essaye de dupliquer aussi les propriétaires --ignore-time ignore l'heure pour décider ou non du téléchargement -n, --only-newer télécharge uniquement les nouveaux fichiers -r, --no-recursion n'entre pas dans les sous-répertoires -p, --no-perms ne définit pas les permissions de fichier --no-umask n'applique pas umask aux modes de fichier -R, --reverse duplication inversée (émet les fichiers) -L, --dereference télécharge les liens symboliques comme des fichiers -N, --newer-than=SPEC télécharge uniquement les fichiers plus jeunes que la date et l'heure spécifiées par SPEC -P, --parallel[=N] télécharge N fichiers en parallèle -i RX, --include RX inclut les fichiers correspondant à RX -x RX, --exclude RX exclut les fichiers correspondant à RX RX est une expression régulière étendue -v, --verbose[=N] mode volubile --log=FILE écrit dans FILE les commandes exécutées par lftp --script=FILE écrit dans FILE les commandes à exécuter par lftp mais ne les exécute pas. --just-print, --dry-run identique à --script=- Lorsque vous utilisez -R, le premier répertoire est local et le second est distant. Si le second répertoire est omis, le nom de base du premier est utilisé. Si les deux répertoires sont omis, les répertoires courants local et distant sont utilisés. Il est fortement recommandé d'utiliser l'option --dry-run pour les essais. Voici un exemple de synchronisation par download : mirror /Data/Photos /data/transfert/photos -v --log /var/log/lftp/download_nas --parallel=10 --no-perms -e * /Data/Photos est la source située sur le serveur distant * /data/transfert/photos est la cible locale * -v rend lftp plus verbeux * --log indique dans quel fichier inscrire les logs, attention ce fichier est écrasé à chaque exécution et n'indique pas le résultat des dry-run * --parallel indique le nombre de transferts en parallèle, pratique pour les fichiers de petite taille * --no-perms ne synchronise pas les permissions * -e supprime dans le répertoire cible les fichiers absents de la source Voici un exemple de synchronisation en upload : mirror -R /space/Videos/ /data/videos/ --ignore-time --no-perms -e -v * -R indique une synchronisation inverse (upload) * /space/Videos/ est la source locale à transférer * /data/videos/ est la cible située sur le serveur distant * --ignore-time indique de ne pas utiliser la date et l'heure des fichiers pour identifier si un transfert est nécessaire (seule la taille est utilisée) * --no-perms indique de ne pas synchroniser les permissions * -e supprime dans le répertoire cible les fichiers absents de la source * -v rend lftp plus verbeux En upload, il n'est pas possible de modifier l'heure des fichiers destinations et souvent les permissions également, c'est pourquoi il est recommander de les désactiver. Lorsque la commande désirée est finalisée, il est possible de la copier dans un fichier pour faire un script lftp. Par exemple : connect nas mirror /Data/Photos /data/transfert/photos -v --log /var/log/lftp/download_nas --parallel=10 --no-perms -e Il suffit ensuite d'exécuter le script avec l'option -f de lftp. ===== Synchronisation automatisée par script ===== Pour automatiser cela, voici un petit script qui exécute un fichier de commande lftp.\\ Ce script exécute lftp en tâche de fond comme un daemon et permet de l'arrêter ou le redémarrer. Pour utiliser le script, il faut : - le copier dans un fichier - modifier NAME à votre convenance - modifier le lien vers le scripts lftp dans DAEMON_OPTS - rendre le fichier exécutable Ce script dispose des options suivantes : * start : démarre la synchro * stop : arrête le process lftp * restart : arrête puis redémarre la synchro * check : indique si le process est toujours en cours Script : #!/bin/sh # lftp synchronization script by Matthieu Bouthors # http://www.bouthors.fr # Change NAME and DAEMON_OPTS before use set -e # Must be a valid filename NAME=lftp_synchro PIDFILE=/var/run/$NAME.pid #This is the command to be run, give the full pathname DAEMON=/usr/bin/lftp DAEMON_OPTS="-f /chemin/vers/cmd.lftp" export PATH="${PATH:+$PATH:}/usr/sbin:/sbin" # check if lftp is running RUNNING=false if [ -e $PIDFILE ] then currentpid=`cat $PIDFILE` if `ps -p $currentpid > /dev/null` then RUNNING=true else rm -f $PIDFILE fi fi case "$1" in start) date if $RUNNING then started=`date -r $PIDFILE` echo "daemon $NAME already started since $started, you need to stop it first" else echo -n "Starting daemon: "$NAME start-stop-daemon --start --quiet --pidfile $PIDFILE --make-pidfile --background --exec $DAEMON -- $DAEMON_OPTS echo "." fi ;; stop) date echo -n "Stopping daemon: "$NAME start-stop-daemon --stop --quiet --oknodo --pidfile $PIDFILE rm -f $PIDFILE echo "." ;; restart) date echo -n "Restarting daemon: "$NAME if $RUNNING then start-stop-daemon --stop --quiet --oknodo --retry 30 --pidfile $PIDFILE rm -f $PIDFILE fi start-stop-daemon --start --quiet --pidfile $PIDFILE --make-pidfile --background --exec $DAEMON -- $DAEMON_OPTS echo "." ;; check) if $RUNNING then echo "$NAME is running" else echo "$NAME is not running" fi ;; *) echo "Usage: "$1" {start|stop|restart|check}" exit 1 esac exit 0