Logiciel pour synchroniser deux répertoires (local / distant)

9

J'ai besoin d'un logiciel qui détecte les modifications dans le répertoire (A) toutes les 5 secondes environ et qui télécharge / supprime les fichiers modifiés dans / dans le répertoire (B) distant.

J'ai trouvé un logiciel non commercial, https://github.com/devstructure/doubledown . Je me demande s'il existe des alternatives commerciales?

Gajus
la source

Réponses:

12

rsync est certainement le bon outil pour ce travail. Il existe pour garder les répertoires synchronisés et peut le faire avec un peu d'intelligence. Par exemple: il ne transfère que les deltas chaque fois que cela est possible et peut fonctionner sur des tunnels SSH.

Supposons que la source d' ordinateur hébergeant votre version en direct de l'arborescence de répertoires /my/treeet le récepteur d' ordinateur que vous souhaitez conserver en synchronisation étroite avec celle-ci. Si vous aviez un compte ssh sur sink, vous pourriez, depuis la source, utiliser rsync comme suit:

rsync -avz --delete -e ssh /my/tree/ remoteuser@sink:/my/tree

Cela suppose que vous voulez /my/treeexactement au même endroit sur l’ évier que vous l’avez sur la source . Bien sûr, vous n'avez pas besoin de le garder exactement au même endroit.

Décomposer la ligne de commande:

  • -avz: mode archive, verbose out, compression utilisée pendant le transfert
  • --delete: supprime les fichiers synchronisés qui ne sont pas présents sur la source
  • -e ssh: Utilisez ssh comme méthode de connexion

Bien entendu, cet appel vous demandera votre mot de passe lorsque vous le ferez. Si vous souhaitez le faire de manière automatisée, vous devrez partager certaines clés entre les comptes des ordinateurs et utiliser le cryptage par clé publique-privée pour établir la connexion SSH.

Pour configurer votre paire de clés pour ce rysnc, exécutez la commande suivante sur votre ordinateur source :

> ssh-keygen -t rsa -b 2048 -f ~/.ssh/my-rsync-key 
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): [press enter here] 
Enter same passphrase again: [press enter here] 
Your identification has been saved in ~/.ssh/my-rsync-key. 
Your public key has been saved in ~/.ssh/my-rsync-key.pub. 
The key fingerprint is: 
2e:28:d9:ec:85:21:e7:ff:73:df:2e:07:78:f0:d0:a0 root@source

> chmod 600 ~/.ssh/my-rsync-key

Pour que cette paire de clés fonctionne, nous devons ajouter le contenu de ~/.ssh/my-rsync-key.pubdans le ~<remoteuser>/.ssh/authorized_keysfichier sur la machine évier .

Commencez par copier le fichier sur la machine évier :

scp ~/.ssh/my-rsync-key.pub remoteuser@sink:~

Ssh ensuite à l' évier machine et importer la clé en exécutant ce qui suit comme remoteuser sur la machine:

> if [ ! -d ~/.ssh ]; then mkdir ~/.ssh ; chmod 700 ~/.ssh ; fi
cd ~/.ssh/ 
if [ ! -f authorized_keys ]; then touch authorized_keys ; chmod 600 authorized_keys ; fi 
cat ~/my-rsync-key.pub >> authorized_keys
rm ~/my-rsync-key.pub

Pour des conseils supplémentaires sur le verrouillage de la connexion SSH entre vos machines source et évier , je vous recommande de consulter cette page .

Depuis votre ordinateur source , vous pouvez vérifier que cette configuration fonctionne en exécutant:

rsync -avz --dry-run -e "ssh -i ~/.ssh/my-rsync-key" /my/tree/ remoteuser@sink:/my/tree

Cela fera un essai complet d'un rsync. Si vous voyez la commande rsync connecter et comparer les fichiers, vous savez que tout est configuré correctement.

Nous avons maintenant besoin d’un moyen simple d’appeler cette commande rsync à partir d’un fichier de configuration LaunchD, comme le montre cette réponse utile sur ce site . Puisque vous voulez que cet appel se déroule en boucle étroite, vous devez vous assurer que plusieurs copies de rsync ne s'exécutent pas en même temps. Vous pouvez utiliser flock pour créer un mutex garantissant qu'un script bash est un singleton: une seule instance de celui-ci est exécutée à la fois sur une machine. Nous allons donc créer le script suivant sur le disque:

#!/bin/sh
SINK_INSTANCE=remoteuser@sink
DIR=/my/tree
KEY=~/.ssh/my-rsync-key
LOG = ~/my_rsync.log
LOCK = ~/my_rsync.lock
SOURCE=/my/tree

exec 9>${LOCK}
if ! flock -n 9  ; then
    echo "Another instance of your rsync is already running";
    exit 1
fi

echo "----------" >> ${LOG}
echo `date` >> ${LOG}

rsync -avz --delete -e "ssh -i ${KEY}" \
    ${SOURCE}/ {SINK_INSTANCE}:${SOURCE} 2>&1 >> ${LOG}

Enregistrez cela sous ~/my_rsync.sh.

Ce script se chargera de faire le rsync pour vous. Tout ce que vous avez à faire maintenant est de le configurer via LaunchD et de le faire fonctionner en boucle. En suivant les instructions de et de la modifier pour répondre à nos besoins, nous allons créer ~/Library/LaunchAgents/my-rsync.plistdans un éditeur de texte et rendre le contenu:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
 "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>My Rsync</string>
    <key>Program</key>
    <string>/bin/sh</string>
    <key>ProgramArguments</key>
    <array>
        <string>sh</string>
        <string>-c</string>
        <string>while sleep 5s; /Users/my/my_rsync.sh; done</string>
    </array>
    <key>ServiceDescription</key>
    <string>Keep /my/tree synchronized with the machine sink</string>
    <key>KeepAlive</key>
    <true/>
</dict>
</plist>

Cela devrait s'occuper des choses.

Les mises en garde habituelles s'appliquent: j'ai écrit ceci de mémoire et je ne l'ai pas testé. Alors ne suivez pas aveuglément. Testez soigneusement le long du chemin. Chaque fois que vous avez un doute, utilisez l' --dry-runoption sur rsync. Il imprimera ce qu'il aurait fait sans rien faire.

Ian C.
la source
2

Au lieu d'exécuter rsynctoutes les 5 secondes, vous pouvez utiliser le démon lsyncd pour surveiller l'arborescence de répertoires.

Cela fonctionne sous OS X /dev/fsevents, mais je n'ai pas de .debfichier prêt pour le plugin . C'est un peu geek de l'avoir compilé et installé. Jusqu'à ce que je publie la version 2.0.6 (bientôt), je vous conseillerais d'utiliser la tête GIT, car lsyncd 2.0.5 a quelques bogues connus sur OS X.

axkibe
la source
Je viens de publier une version corrigée d'OSX. À la différence de devoir gaspiller des ressources en exécutant quelque chose toutes les 5 secondes, rien ne s’est probablement passé, Lsyncd n’appelle rsync que lorsque quelque chose s’est passé.
axkibe
1

rsync serait un excellent outil pour cela, et il est intégré à Mac OS. Il vérifiera les différences entre deux emplacements, puis ne copiera que les modifications delta sur le réseau. rsync sans aucun drapeau supplémentaire fait presque exactement ce que vous recherchez.

Le seul ajout est que vous auriez besoin de le lancer toutes les 5 secondes pour vérifier les modifications. Vous pouvez le faire en utilisant launchd, avec un bon exemple déjà sur ce site . Dans cet exemple, il semble que le script continue à s'exécuter, puis attend 5 secondes avant de s'exécuter à nouveau.

Le problème avec l’exécution si fréquente est que l’outil devra également vérifier les différences et, s’il ya tant de modifications en 5 secondes, le temps système pour enregistrer ces modifications et les transférer peut prendre plus de 5 secondes.

jmlumpkin
la source
0

Folderwatch est une alternative commerciale pour l’Appstore à seulement 11,99 $. Folderwatch synchronise (reflète) les dossiers sur les volumes formatés HFS-Plus en temps réel sur des lecteurs externes et des serveurs de fichiers AFP. http://itunes.apple.com/us/app/folderwatch/id408224368?mt=12

Sauvegarde Pro
la source
0

J'utilise FolderSync (8.99 App Store) et je l'aime vraiment beaucoup. Belle interface utilisateur avec navigation synchronisée dans deux volets. Vous permet de sauvegarder un travail de synchronisation pour une utilisation ultérieure.

Jtreser
la source