Linux rsync : Comment synchroniser des fichiers localement et via SSH

rsync est un outil qui copie des fichiers et des répertoires vers des systèmes locaux ou distants et transfère les modifications. Le comportement par défaut est de copier dans un sens, de la source vers la destination, et les fichiers existant uniquement dans la destination ne sont pas supprimés sauf si --delete est spécifié.

Avant de commencer

Les exemples sont exécutés dans le shell Linux. Tout d'abord, vérifiez s'il est installé avec rsync --version. Sur Ubuntu, s'il n'est pas installé, vous pouvez l'installer avec la commande suivante. Pour les transferts à distance, rsync est requis sur les deux systèmes, et si vous utilisez SSH (Secure Shell), l'accès à distance et les permissions d'écriture sur le chemin de destination sont également nécessaires.

sudo apt update
sudo apt install rsync

Si vous saisissez les chemins source et cible à l'envers, vous pouvez écraser ou supprimer les données souhaitées. Avant de manipuler des données importantes, assurez-vous de sécuriser une sauvegarde distincte, et surtout lors de l'utilisation de l'option de suppression, vérifiez d'abord les changements prévus avec --dry-run. La synchronisation est différente d'une sauvegarde qui restaure un point précédent, car les erreurs ou la corruption dans la source peuvent également se répercuter sur la cible.

Copie du répertoire local et la différence des barres obliques

Voici un exemple de création d'un nouveau dossier de pratique sous le répertoire personnel et de préparation d'un fichier. S'il existe déjà un dossier portant le même nom, utilisez un nom différent.

mkdir -p "$HOME/rsync-demo/source" "$HOME/rsync-demo/dest"
printf 'hello\n' > "$HOME/rsync-demo/source/hello.txt"
rsync -av "$HOME/rsync-demo/source/" "$HOME/rsync-demo/dest/"
ls -l "$HOME/rsync-demo/dest/"

Si hello.txt apparaît dans le résultat de la dernière commande, le contenu du répertoire source a été copié dans la cible. Exécuter à nouveau la même commande rsync ne retransfère généralement pas les fichiers ordinaires qui n'ont pas changé. La comparaison de base utilise la taille des fichiers et l'heure de modification, donc ce n'est pas une vérification complète que le contenu est identique.

Le / à la fin de la source signifie que le contenu à l'intérieur du répertoire, et non le répertoire lui-même, est copié vers la destination. Si le répertoire cible existe déjà et que vous omettez la barre oblique, le nom du répertoire source sera créé sous la destination.

rsync -av "$HOME/rsync-demo/source" "$HOME/rsync-demo/dest/"

Exécuter cette commande créera dest/source/hello.txt. Le dest/hello.txt créé précédemment restera tel quel. La différence entre les deux chemins est particulièrement importante lors de l'utilisation de l'option de suppression. S'il y a des espaces dans le chemin, entourez-le de guillemets comme dans l'exemple.

Options fréquemment utilisées et vérifications préalables

  • -a : Il s'agit du mode archive. Il demande une copie récursive et la préservation du temps, des permissions, du propriétaire, du groupe et des liens symboliques. La préservation de la propriété peut être limitée en fonction des permissions et du support du système de fichiers cible. Les ACL et les attributs étendus ne sont pas inclus dans -a.
  • -v : Affiche la sortie détaillée de l'opération.
  • -n ou --dry-run : Montre les opérations prévues sans effectuer de modifications.
  • -z : Utilise la compression pendant le transfert. L'efficacité varie en fonction des conditions du réseau et des types de fichiers, et elle n'est pas toujours nécessaire pour les copies locales.

Par exemple, vous pouvez vérifier comme suit avant la copie réelle. La sortie montre les changements attendus, et si des fichiers changent ou si des erreurs se produisent entre un essai et l'exécution réelle, le résultat réel peut différer.

rsync -avn "$HOME/rsync-demo/source/" "$HOME/rsync-demo/dest/"

Si vous devez vérifier si des fichiers de même taille et du même moment de modification ont en fait un contenu différent, vous pouvez envisager une comparaison avec --checksum, mais cela peut être coûteux puisque les deux fichiers sont lus. Pour la signification détaillée des options, référez-vous au manuel officiel rsync.

Suppression des fichiers qui existent uniquement dans la destination

--delete supprime les éléments du répertoire cible de synchronisation qui n'existent pas dans la source. Si vous spécifiez accidentellement une destination ou un niveau de répertoire incorrect, des fichiers nécessaires peuvent également être supprimés, vérifiez donc d'abord le chemin cible et le slash final de la source et examinez les résultats d'un essai.

L'exemple suivant peut lister les éléments qui existent uniquement dans la destination, comme le dest/source/ créé ci-dessus, pour suppression. Exécutez-le uniquement lorsqu'il n'y a pas de fichiers à conserver dans le dossier d'exercice.

rsync -avn --delete "$HOME/rsync-demo/source/" "$HOME/rsync-demo/dest/"

Vérifiez les entrées deleting dans la sortie et ne supprimez -n pour l'exécuter réellement que si l'étendue de la suppression est correcte et que des sauvegardes pour la récupération sont prêtes.

rsync -av --delete "$HOME/rsync-demo/source/" "$HOME/rsync-demo/dest/"

Cette commande ne change que la destination et ne supprime pas les fichiers de la source. Les fichiers qui existaient uniquement dans la destination peuvent ne pas être récupérables sans les procédures habituelles de récupération de fichiers. Préparez des sauvegardes de version séparées et une vérification de restauration pour les données opérationnelles.

Exclusion de fichiers ou de répertoires

Pour exclure le répertoire cache de la source de la cible de transfert, spécifiez-le comme suit. Puisque le contenu de la source est la racine du transfert, la barre oblique initiale fait référence à cache à cette racine. Tout d'abord, effectuez un essai pour vous assurer que seuls les éléments souhaités sont exclus.

rsync -avn --exclude='/cache/' "$HOME/rsync-demo/source/" "$HOME/rsync-demo/dest/"

Si le résultat est correct, supprimez -n et copiez-le. La règle d'exclusion par défaut protège généralement les éléments d'exclusion de la cible dans --delete, mais l'utilisation de --delete-excluded ou la modification des règles de filtrage peut modifier le comportement. Vérifiez les motifs complexes dans un dossier séparé avant de les appliquer aux données réelles.

Synchroniser avec un serveur distant via SSH

Dans un environnement prêt pour l'accès SSH, la commande suivante envoie le contenu de la source locale au répertoire cible sur le serveur distant. Remplacez user, server.example.com et les chemins par des valeurs réelles, et préparez le répertoire cible distant à l'avance. Lors de la première connexion, vérifiez l'empreinte de la clé hôte du serveur via un canal de confiance.

rsync -avn -e ssh "$HOME/rsync-demo/source/" user@server.example.com:/home/user/backup/

Après avoir consulté la liste de transfert prévue, supprimez -n pour le transférer. Inversement, pour récupérer depuis le serveur distant vers la machine locale, définissez le chemin distant comme emplacement source.

rsync -avn -e ssh user@server.example.com:/home/user/backup/ "$HOME/rsync-demo/dest/"

Si le port SSH diffère de celui par défaut, par exemple, utilisez -e 'ssh -p 2222'. Pour l'accès distant, il est recommandé d'utiliser un compte avec des permissions limitées et l'authentification par clé SSH. Ne saisissez pas directement le mot de passe dans la commande car il pourrait être exposé dans les informations de processus ou l'historique du shell ; par conséquent, l'exemple sshpass -p dans l'article précédent n'est pas utilisé. Dans les tâches automatisées, gérez la protection des clés et la portée d'accès ensemble.