Main menu:

Site search

Categories

juin 2010
L M M J V S D
 123456
78910111213
14151617181920
21222324252627
282930  

Archive

Synchroniser deux répertoires distants par FTP

On connait tous rsync qui permet de synchroniser deux répertoires en faisant des sauvegardes incrémentielles. Cette synchronisation est unidirectionnelle; il y a un répertoire source et un répertoire de destination. Malheureusement, rsync ne fonctionne pas en FTP. Mais heureusement, dans la panoplie des outils pour Linux, il existe une application qui est capable de synchroniser deux répertoires via FTP: lftp.

lftp est un client FTP très évolué. Il s’utilise en ligne de commande et son gros avantage est sa capacité de faire du mirroring. Le mirroring consiste à comparer deux répertoires et à les synchroniser pour qu’ils soient identiques. lftp est capable de synchroniser un répertoire distant avec un répertoire local ou, l’inverse, synchroniser un répertoire local avec un répertoire distant. La différence réside dans le fait que dans le premier cas, la source est le répertoire local et dans le second, la source est le répertoire distant.

La commande de base si on veut que la source soit le répertoire local est :

lftp ftp://login:password@host -c "mirror --delete --reverse --exclude-glob dossier_à_exclure /répertoire_local /répertoire_distant"

Dans le cas où on veut une synchro du répertoire local avec comme source le répertoire distant, on supprime l’option –reverse.
l’option -c de lftp permet de donner à lftp un ensemble de commandes. Elle doivent être entre guillemets et séparées par des points-virgules. Notez aussi que l’option –exclude-glob peut être insérée plusieurs fois s’il y a plusieurs répertoires ou fichiers à exclure. Cette option accepte les wildcards (*,?). Je ne vais pas détailler toutes les commandes mais sachez que les commandes classiques de FTP sont reconnues (cd, lcd, get, mmet, put, mput,…). Je vous conseille la lecture de la page de manuel pour toutes les options et possibilités de ce programme.

Evidemment, lftp est particulièrement bien adapté à son utilisation au sein d’un script. A titre d’exemple, voici un petit script bash appelé ftpsync qui synchronise un répertoire distant à partir d’un répertoire local:

#!/bin/bash
#
# Synchronise deux répertoires en utilisant FTP

HOST="ftp.votre_site.com"
LOGIN="votre_login"
PASSWORD="mot_de_passe"
LOCALDIR="$1"
REMOTEDIR="/"
EXCLUDED="*.*~"

function Usage()
{
  echo -e "\n  Synchronise un répertoire local avec un répertoire distant en utilisant FTP";  
  echo -e "\n  USAGE: ftpsync local_dir";
  echo;
}

if [ "$LOCALDIR" = "" ]
then
  echo -e "  ERREUR: Veuillez spécifier un répertoire local";
  Usage;
  exit 1;
fi

if [ -e "$LOCALDIR" ]
then
  lftp -c "set ftp:list-options -a;
  open ftp://$LOGIN:$PASSWORD@$HOST; 
  lcd $LOCALDIR;
  cd $REMOTEDIR;
  mirror --reverse \
         --delete \
         --verbose \
         --exclude-glob $EXCLUDED";
fi

A l’heure où on parle de plus en plus de cloud computing, où il est facile de se procurer des zones de stockage sur Internet gratuitement comme DropBox, UbuntuOne ou autre SpiderOak, synchroniser deux répertoires par FTP peut sembler anachronique mais lftp peut encore rendre de grands services pour faire, par exemple, des backups de votre site web distants sur votre PC en local.

Comments

Comment from Pierig
Time: 8 juin 2010, 7 h 58 min

Bonjour,

Merci pour le blog que je suis, même si je ne commente pas souvent.

Y a t il des avantages majeurs par rapport à Unison? qui le fait aussi.
Unison doit être installé sur les deux postes, mais par contre il synchronise en mode croisé. Certains fichiers peuvent avoir été changer sur la source, d’autre sur la destination…

Comment from admin
Time: 8 juin 2010, 12 h 00 min

Unison est bien mieux. Son seul inconvénient est qu’il doit être installé sur le poste local et le distant. Son gros avantage est que du coup il est bidirectionnel.
Mais de temps en temps, on n’a pas la possibilité de l’installer en local et en distant. Dans mon cas, je dispose d’une zone de backup mis à ma disposition par mon hébergeur web. Le problème était que je n’ai qu’un accès ftp sur cette zone. Pouvoir faire du mirroring en ftp est déjà un grand plus.

Comment from CIX
Time: 12 décembre 2011, 11 h 56 min

Bj,

Avec la version 4.0.6 delftp c’est l’option « -e » qui doit être utilisée à la place de « -c ».

Merci pour le petit Tuto. ++

Comment from Rpnpif
Time: 8 novembre 2012, 20 h 39 min

CIX a écrit : Avec la version 4.0.6 de lftp c’est l’option « -e » qui doit être utilisée à la place de « -c ».

Non, pas vraiment.

L’argument -c exécute les commandes qui le suivent et termine lftp ensuite, alors que -e permet de poursuivre manuellement dans l’environnement de lftp après exécution des commandes.

Donc Michel n’a pas fait d’erreur, c’est bien -c qu’il faut utiliser dans son script.

Bon tutoriel, très clair. Merci.

Comment from BeHuman
Time: 3 janvier 2014, 12 h 43 min

2014, ton script est toujours utile 😛 merci pour le partage ++