Jump to content

Archived

This topic is now archived and is closed to further replies.

Myze

Synchronisation distante avec rsync

Recommended Posts

Bonjour,

 

Je cherche une personne qui pourrait m'accompagner dans la mise en place de la synchronisation automatique entre deux repertoires distants de machines debian.

Je pense utiliser rsync pour faire cela, mais si il y a mieux je suis ouvert ;-)

Je souhaite que la synchro soit que dans un sens et que ce soit la machine 2 qui vienne prendre sur la machine 1 uniquement les fichiers modifiés ou ajoutés.... j'espère être un minimum clair :-)

Il faudra passer par une connexion ssh avec clé.

 

Voilà si quelqu'un est intérressé pour donner un coup de main.

 

Merci d'avance

 

Share this post


Link to post
Share on other sites

Salut, une petite recherche sur le net et tu aurais très probablement trouvé ta réponse.

 

Autrement pour faire avec rsync c'est pas compliqué :

 

1. Génère tes clefs ssh

2. Place ta clé dans le authorized_keys de la machine sur laquelle tu va te connecter

3. Ensuite tu copies : rsync -avzSm -e "ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" --progress  utilisateur@xxx.xxx.xxx.xxx:/le/dossier/distant/a/copier /emplacement/local/de/destination/

 

Après tu met ça dans un cron pour l'automatisation et le tour est joué

Share this post


Link to post
Share on other sites
Salut, une petite recherche sur le net et tu aurais très probablement trouvé ta réponse.

 

Le but du forum, c'est de demander quand on sait pas et de partager quand on sait. :D

 

Évidemment que ce type d'info se trouve facilement sur le net, mais c'est mieux de pouvoir en discuter au cas par cas, surtout quand jeanmyzeure demande à être accompagné. :chinois:

Share this post


Link to post
Share on other sites
3. Ensuite tu copies : rsync -avzSm -e "ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" --progress utilisateur@xxx.xxx.xxx.xxx:/le/dossier/distant/a/copier /emplacement/local/de/destination/

 

Tout d'abord une précision vu que tu veux récupérer les données de tes ordis A et B sur un ordi C : A et B seront des serveurs et C le client (même si c'est un NAS ou qu'il à l'apparence physique d'un serveur).

 

La commande donnée ici a quelques soucis de sécurité au niveau de config de SSH.

 

Normalement pour s'assurer de communiquer avec le bon serveur et pas un espion qui fait du MITM à la première connexion le client SSH affiche un message demandant de vérifier la signature du serveur et la valider. Si par la suite cette signature change c'est qu'il y a un problème donc SSH coupe tout par sécurité.

 

StrictHostKeyChecking=no va ajouter automatiquement cette signature de serveur au fichier de serveurs SSH connus si il ne la connaît pas déjà.

 

UserKnownHostsFile permet de définir dans quel fichier est stocker la liste. Le fichier /dev/null est toujours vide et tout ce qui y est écrit disparaît.

 

Comme tu peux le deviner combiner les deux est très risqué car cela désactive totalement la vérification du serveur SSH. Je te conseilles de retirer totalement le -e "ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null". Avant la première syncro il te suffira juste de te connecter manuellement à chaque serveur depuis le client et ce par un moyen sécurisé (ex : réseau local). Sur le client il faudra pour ce faire utiliser le même profil utilisateur que celui qui va faire les syncro par la suite.

 

Sinon je n'est jamais utilisé les options -S -m et --progress mais il ne devrait pas y avoir de soucis.

Share this post


Link to post
Share on other sites

Merci pour vos réponses.

 

Je vais vous détailler ma configuration actuelle pour que cela soit plus clair.

 

Chez moi (IPMaison):

 

1 serveur de fichier sous Debian avec connexion ssh par clé (mot de passe désactivé) Il a une ip interne 192.168.0.200 (ssh sur le 22 en interne)

Il est accessible de l'extérieur via un port ssh que j'ai ouvert sur ma box via ipmaison:port qui redirige vers le 22 de la machine

1 disque dur système pour Debian, et un disque (/dev/md1) DATA

 

Au boulot:

 

1 Raspberry avec le système raspbian et un disque en usb dessus (/dev/sdb) de la taille équivalente à celui des data du serveur maison

Il n'est pas accessible de l'extérieur et il n'y a pas de redirection vers le port 22

 

Voilà pour que ça soit plus clair pour vous :-)

 

Encore merci d'avance pour votre aide.

Share this post


Link to post
Share on other sites

Tout d'abord une précision vu que tu veux récupérer les données de tes ordis A et B sur un ordi C : A et B seront des serveurs et C le client (même si c'est un NAS ou qu'il à l'apparence physique d'un serveur).

 

La commande donnée ici a quelques soucis de sécurité au niveau de config de SSH.

 

Normalement pour s'assurer de communiquer avec le bon serveur et pas un espion qui fait du MITM à la première connexion le client SSH affiche un message demandant de vérifier la signature du serveur et la valider. Si par la suite cette signature change c'est qu'il y a un problème donc SSH coupe tout par sécurité.

 

StrictHostKeyChecking=no va ajouter automatiquement cette signature de serveur au fichier de serveurs SSH connus si il ne la connaît pas déjà.

 

UserKnownHostsFile permet de définir dans quel fichier est stocker la liste. Le fichier /dev/null est toujours vide et tout ce qui y est écrit disparaît.

 

Comme tu peux le deviner combiner les deux est très risqué car cela désactive totalement la vérification du serveur SSH. Je te conseilles de retirer totalement le -e "ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null". Avant la première syncro il te suffira juste de te connecter manuellement à chaque serveur depuis le client et ce par un moyen sécurisé (ex : réseau local). Sur le client il faudra pour ce faire utiliser le même profil utilisateur que celui qui va faire les syncro par la suite.

 

Sinon je n'est jamais utilisé les options -S -m et --progress mais il ne devrait pas y avoir de soucis.

 

C'est sur que c'est pas le moyen le plus secure mais c'est histoire qu'il ne se casse pas la tête avec les signatures.

Pour le -S c'est pour gérer les fichier de sparse, -m pour ne pas copier les dossiers vides et --progress pour la progression mais après si c'est voué à l'automatisation tu peux retirer -v et --progress.

Share this post


Link to post
Share on other sites

Bonjour,

 

La synchronisation distante avec rsync se fait à travers ssh. Pour pouvoir lancer une synchronisation ssh automatisée, il faut donc que la machine qui exécute rsync ait un accès ssh sans mot de passe.

 

Permettre la connexion ssh sans mot de passe : http://korben.info/login-ssh-sans-mot-de-passe.html

 

Si j'ai bien compris dans ton cas c'est la machine 2 (Raspberry Pi) qui se connectera au serveur 1 (serveur Debian maison). Il faut donc que le R.Pi ait un accès ssh sans mot de passe au serveur Debian.

 

Ensuite, toujours si j'ai bien compris, tu n'utilises pas le port 22 par défaut pour te connecter en ssh à ton serveur, mais un autre port, pour le besoin de la démonstration disons que c'est le port 2222 (à remplacer par le vrai port que tu utilises). Du coup dans ta commande rsync il faudra utiliser l'option -e "ssh -p 2222" (avec les guillemets).

 

Maintenant le B.A.-BA de rsync : c'est un programme qui fonctionne comme cp (copie de fichiers), avec une syntaxe similaire, c'est-à-dire qu'il va copier des fichiers depuis une source vers une destination (donc dans une seule direction) :

 

rsync source destination

 

La différence avec un simple cp, c'est que rsync va comparer les listes de fichiers source et destination, et ne va copier que les fichiers nouveaux et ceux qui ont été modifiés.

 

Si tu veux synchroniser dans les deux sens, il faudra donc exécuter rsync deux fois : une première fois pour copier les fichiers du R.Pi vers le serveur, et une deuxième fois pour les coipier du serveur vers le R.Pi.

 

Dans ton cas la commande complète peut donner quelque chose comme ça (à exécuter sur le R.Pi) :

 

rsync -avz  -e "ssh -p 2222" /home/jeanmyzeure/Documents/  login@ipmaison:/home/jeanmyzeure/Documents/

rsync -avz  -e "ssh -p 2222" login@ipmaison:/home/jeanmyzeure/Documents/  /home/jeanmyzeure/Documents/

 

Les signes slash (/) à la fin des chemins sont importants !

 

Un petit mot sur les options (voir la doc de rsync aussi) :

-a permet de synchroniser le dossier et tous ses éléments de façon récursive.

-v est le mode verbeux, rsync te raconte ce qu'il synchronise (tu peux l'enlever si tu mets en place un truc automatisé).

-z active la compression des données pendant le transfert (recommandé, ça accélère pas mal les transferts).

 

Note que ces commandes ne suppriment jamais aucun fichier, elles ne font que mettre à jour les fichiers existants, et copier les nouveaux fichiers. Si tu veux en plus, supprimer du serveur les fichiers qui ont été supprimés sur le R.Pi, alors il faut utiliser rsync avec une option comme --delete-before ou bien --delete-after (qui supprime ces fichiers avant ou après le transfert, respectivement).

Share this post


Link to post
Share on other sites

Merci Konrad pour l’explication très clair, je vais tester tout ça et vous tiens au courant du résultat.

Share this post


Link to post
Share on other sites

Bonjour,

 

La synchronisation distante avec rsync se fait à travers ssh. Pour pouvoir lancer une synchronisation ssh automatisée, il faut donc que la machine qui exécute rsync ait un accès ssh sans mot de passe.

 

Permettre la connexion ssh sans mot de passe : http://korben.info/login-ssh-sans-mot-de-passe.html deprecié voir : http://formation-debian.via.ecp.fr/ssh.html

 

 

Si j'ai bien compris dans ton cas c'est la machine 2 (Raspberry Pi) qui se connectera au serveur 1 (serveur Debian maison). Il faut donc que le R.Pi ait un accès ssh sans mot de passe au serveur Debian.

 

Ensuite, toujours si j'ai bien compris, tu n'utilises pas le port 22 par défaut (si si justement) pour te connecter en ssh à ton serveur, mais un autre port, pour le besoin de la démonstration disons que c'est le port 2222 (à remplacer par le vrai port que tu utilises). Du coup dans ta commande rsync il faudra utiliser l'option -e "ssh -p 2222" (avec les guillemets).

 

Maintenant le B.A.-BA de rsync : c'est un programme qui fonctionne comme cp (copie de fichiers), avec une syntaxe similaire, c'est-à-dire qu'il va copier des fichiers depuis une source vers une destination (donc dans une seule direction) :

 

rsync source destination Pour du push. Le pull tu inverse. Ca peut avoir son importance (cf  --del)

 

La différence avec un simple cp, c'est que rsync va comparer les listes de fichiers source et destination, et ne va copier que les fichiers nouveaux et ceux qui ont été modifiés.

 

Si tu veux synchroniser dans les deux sens, il faudra donc exécuter rsync deux fois : une première fois pour copier les fichiers du R.Pi vers le serveur, et une deuxième fois pour les coipier du serveur vers le R.Pi.

 

Dans ton cas la commande complète peut donner quelque chose comme ça (à exécuter sur le R.Pi) :

 

rsync -avz  -e "ssh -p 2222" /home/jeanmyzeure/Documents/  login@ipmaison:/home/jeanmyzeure/Documents/ je rajouterais -r mais bon...

rsync -avz  -e "ssh -p 2222" login@ipmaison:/home/jeanmyzeure/Documents/  /home/jeanmyzeure/Documents/

 

Les signes slash (/) à la fin des chemins sont importants ! Pas forcement. Ca peut se faire sans.

 

Un petit mot sur les options (voir la doc de rsync aussi) :

-a permet de synchroniser le dossier et tous ses éléments de façon récursive.

-v est le mode verbeux, rsync te raconte ce qu'il synchronise (tu peux l'enlever si tu mets en place un truc automatisé).

-z active la compression des données pendant le transfert (recommandé, ça accélère pas mal les transferts).

-u This  forces  rsync  to  skip  any files which exist on the destination and have a modified time that is newer than the source file.

 

Note que ces commandes ne suppriment jamais aucun fichier, elles ne font que mettre à jour les fichiers existants, et copier les nouveaux fichiers. Si tu veux en plus, supprimer du serveur les fichiers qui ont été supprimés sur le R.Pi, alors il faut utiliser rsync avec une option comme --delete-before ou bien --delete-after (qui supprime ces fichiers avant ou après le transfert, respectivement).

 

Oui mais.

 

Bref je conseille quelques  lectures : 

-https://calomel.org/rsync_tips.htmlCa peut te servir si tu veut backup ton /home/user en excluant des répertoires (genre ~/.cache/chromium)

-http://formation-debian.via.ecp.fr/ssh.html(parce que bon c'est la base, il faut bien comprendre pour pas louper une option)

 

Et bien sur le man de rsync. Trop d'options, pas assez de temps :D

 

:smack:

Share this post


Link to post
Share on other sites

J'attend ton analyse du man de rsync avec impatience :D

Un rapide résumé de 300 pages nous suffira amplement. :chinois:

Share this post


Link to post
Share on other sites

Hello,

 

D'abord merci pour votre aide, j'ai lancé ma commande

rsync -avzru --progress -e "ssh -p 2222" root@17.18.19.20:/data/DATA/ /media/data/DATA/

Le transfert c'est lancé avec succés.

Juste je pense ajouter l'option "--delete" pour suppr les fichiers ou dossiers que j'aurais supprimé sur la source. Cela est bon avec cette option ?

Share this post


Link to post
Share on other sites

Oui mais je préfères --delete-after comme cela en cas de déplacement de fichier il commence par renvoyer les données (qui sont alors présentes en double sur la destination) et seulement après il efface les fichiers du répertoire où ils était avant le déplacement.

 

Avec juste --delete il est possible qu'a un moment la destination n'ai plus les données (moment entre la suppression et le retransfert).

Share this post


Link to post
Share on other sites

×
×
  • Create New...