Si vous voulez devenir hardcore, vous pouvez utiliser la commande rsync en natif dans OsX , comme * nix staff.
Avant tout, vous devez avoir la permission d'accéder à l'hôte distant par ssh. Le serveur OpenSSH est préinstallé sur Mac OsX et vous n'avez pas besoin d'installer de package supplémentaire. Il suffit de faire quelques réglages système. Pour activer le serveur OpenSSH sur Mac OS X, ouvrez les Préférences Système et cliquez sur Partager. Et puis, cochez la case Connexion à distance pour activer SSH, puis sélectionnez le bouton radio intitulé Tous les utilisateurs dans la section Autoriser l'accès pour .
Vous pouvez maintenant accéder à l'hôte distant par ssh.
Maintenant, vous devez créer une clé d'accès publique pour un accès sans mot de passe de l'ordinateur invité local à l'hôte distant via ssh. Pour cela, vous devez vous salir un peu la main. :)
Tout d'abord, déterminez si vous disposez déjà de clés d'authentification. Dans le terminal , exécutez:
sudo ls -la /var/root/.ssh
Si vous voyez "id_dsa" et id_dsa.pub , vous pouvez ignorer le reste de cette section.
Sur la machine cliente, exécutez ce qui suit dans le terminal:
sudo ssh-keygen -t dsa -f /private/var/root/.ssh/id_dsa -C "comment about this key"
Après avoir créé la clé d'accès sur l'ordinateur invité local, vous devez copier la clé publique de l'invité dans le fichier authorized_keys de l'hôte. Vous pouvez le faire avec une simple commande Terminal qui ajoute la clé publique à la liste des clés autorisées:
sudo cat /private/var/root/.ssh/id_dsa.pub | ssh root@remote_host_address 'cat - >> ~/.ssh/authorized_keys'
La commande ci-dessous qui effectuera une sauvegarde incrémentielle de votre système de fichiers racine sur l'ordinateur invité local sur votre hôte distant:
/usr/local/bin/rsync -aNHAXx --protect-args --fileflags --force-change --rsync-path="/usr/local/bin/rsync" / root@remote_host_address:/Volumes/Backup/GuestMachine
Vous pouvez modifier les paramètres de rsync pour modifier les comportements de synchronisation. Si vous ajoutez cette commande dans crontab , la synchronisation peut être exécutée dans n'importe quel cycle de temps. Par exemple:
sudo crontab -e
ajouter la ligne ci-dessous pour crontab:
*/30 * * * * /usr/local/bin/rsync -aNHAXx --protect-args --fileflags --force-change --rsync-path="/usr/local/bin/rsync" / root@remote_host_address:/Volumes/Backup/GuestMachine
Cette opération exécutera la synchronisation toutes les demi-heures.
Voici l'exemple de script Python:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Cron automated synchronization script.
Desc: Synchronize remote folder into local machine. Duplicate processes
are disallowed until running process finished.
Usage:
:: Change required variables as _user, _password, _domain etc.
:: Edit crontab
# crontab -e
:: Append line below.
*/30 * * * * python synchronizator.py 2>&1 &
Author: Sencer HAMARAT (RecNes)
E-Mail: sencerhamarat@gmail.com
"""
import shlex
from subprocess import Popen, PIPE
import logging as log
import sys
__author__ = "Sencer HAMARAT"
_user = 'username'
_password = 'password'
_domain = 'example.com'
_expectation = "Enter passphrase for key \'/home/%s/.ssh/id_rsa\':" % _user
_rsync = '/usr/bin/rsync --partial --progress -avvz -e'
_pub_key = '/home/%s/.ssh/id_rsa.pub' % _user
_ssh = '/usr/bin/ssh -i %s' % _pub_key
_remoteDir = '/home/%s/backup/' % _user
_localDir = '/home/%s/backup/' % _user
_command = '%s %s %s@%s:%s %s' % (_rsync, _ssh, _user, _domain, _remoteDir, _localDir)
run_command = shlex.split(_command)
_logFile = "logfile.log"
_logFormat = "%(asctime)s %(levelname)s %(name)s %(process)d %(threadName)s %(module)s:%(lineno)d %(funcName)s() " \
"%(message)s\n"
log.basicConfig(filename=_logFile, level=log.DEBUG, format=_logFormat)
log.debug(u'Command will run: %s' % _command)
try:
running_command = Popen(run_command, stdin=PIPE, stdout=PIPE, stderr=PIPE)
if running_command.poll():
log.debug(repr(running_command.poll()))
sys.exit()
if _expectation in running_command.communicate():
running_command.communicate(_password)
print running_command.communicate()
except Exception as e:
log.debug(repr(e))
finally:
sys.exit()