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/tree
et 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/tree
exactement 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.pub
dans le ~<remoteuser>/.ssh/authorized_keys
fichier 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 là et de la modifier pour répondre à nos besoins, nous allons créer ~/Library/LaunchAgents/my-rsync.plist
dans 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-run
option sur rsync. Il imprimera ce qu'il aurait fait sans rien faire.