web-dev-qa-db-fra.com

Unison - Synchroniser automatiquement les ordinateurs

Existe-t-il un moyen de synchroniser plusieurs ordinateurs (c’est-à-dire des répertoires particuliers du dossier d’accueil) automatiquement à l’aide de Unison? Si non, y a-t-il une alternative qui peut le faire? Je ne suis pas totalement opposé à l'ouverture simultanée de Unison et à la synchronisation manuelle, mais lors de son ouverture, vous devez sélectionner un profil, qui correspond à un seul répertoire. Vous devez donc les synchroniser individuellement. Ajoutez à cela l'adresse IP est dynamique et doit donc être modifiée. C'est assez fastidieux et il semble qu'il devrait y avoir un moyen plus simple. Est-ce que je manque quelque chose? Existe-t-il un moyen de simplifier ce processus (éventuellement un script bash)?

6
Nateowami

Ma suggestion serait de résoudre le problème de l’adresse IP dynamique (la plupart des routeurs ont le concept de réservation d’adresses, que vous pouvez utiliser pour "réparer" l’adresse IP de votre ordinateur). Après cela, vous pouvez utiliser la version en ligne de commande de unison:

unison -auto -batch profilename 

et vous pouvez l'ajouter à vos scripts de connexion/déconnexion ou en tant que tâche cron.

Si vous avez encore besoin de changer l'adresse IP, vous pouvez utiliser sed dans un script:

  1. créez un fichier modèle dans ~/.unison, newprof.tmpl, comme ceci:

    root = /home/romano/
    root = ssh://romano@MYIPHERE//home/romano/
    
    path = education
    path = research
    
  2. créez le script suivant, appelez-le sync_newprof:

    #!/bin/bash
    # 
    cd $HOME/.unison
    cat newprof.tmpl | sed s/MYIPHERE/$1 >! newprof.prf
    unison -auto -batch profilename
    

    en gros, nous créons un fichier de profil modifiant le mot MYIPHERE avec le premier argument du script.

  3. maintenant vous pouvez l'appeler comme

    sync_newprof 1.1.1.1 
    

    et il va créer le profil avec l'IP donnée et sync.

5
Rmano

Sur un réseau local, vous avez deux machines sur lesquelles vous souhaitez synchroniser automatiquement et en toute sécurité /home/<username>/Desktop toutes les 10 minutes: "Hôte" qui exécute votre serveur OpenSSH et "Client" qui se connecte via SSH à "Hôte".

Vue d'ensemble de la solution *

  • Configurer un serveur OpenSSH sur l'hôte
  • Installer Unison sur le client et l'hôte
  • Créer le script 1 pour que cron puisse utiliser la clé RSA de <username>
  • Ajoutez deux lignes à la crontab de <username>, et
  • Définissez le script 1 pour qu'il s'exécute au démarrage.

Installer le serveur OpenSSH sur l'hôte

Voir Setup SFTP Server pour configurer un serveur OpenSSH qui écoute les connexions SSH sous le nom <username> sur l'hôte, utilise une adresse IP statique, écoute sur un port non standard, refuse les connexions basées sur un mot de passe et autorise les connexions de clé RSA si l'hôte possède la RSA public_key.

Installer Unison sur le client et l'hôte

Sur les deux machines, exécutez (unison-gtk est une interface graphique si vous le souhaitez):

Sudo apt-get install unison unison-gtk

Créer un script

cron ne partage pas le même environnement que <username> et ne trouvera donc pas la clé client RSA nécessaire pour se connecter à l'hôte. Le script 1 fournit cet environnement au fichier crontab de <username>.

Le script 1 génère également le script 2 qui est exécuté par le fichier crontab de <username> toutes les 10 minutes et exécute Unison.

  • CAVEAT! Je ne suis pas un expert en script et adapté cela [1]

Script 1 (/home/<username>/Documents/Scripts/set_ssh_env_for_cron_unison.sh)

#!/bin/sh
SSH_ENV=$HOME/.ssh/environment_for_cron    ## file to be generated
SSH_ENV2=$HOME/Documents/Scripts/unison_sync.sh    ## Script 2 to be generated
function start_agent {
   echo "Initialising new SSH agent..." 
   env | grep SSH | sed 's/SSH_AUTH_SOCK=//' > ${SSH_ENV}   ## send output of env | grep SSH minus "SSH_AUTH_SOCK=" so cron can get output from SSH_ENV
     ## create a new script with three lines, line 3 is unison command
   echo "#!/bin/sh" > ${SSH_ENV2}   ## line 1
   env | grep SSH >> ${SSH_ENV2}    ## line 2
   echo "/usr/bin/unison /home/<username>/Desktop ssh://<Host's local IP address>:<Host's listening SSH Port>//home/<username>/Desktop -batch -debug update+ -ignore 'Name *.gvfs' -ignore 'Name .cache*' -ignore 'Name [Cc]ache*' -ignore 'Name .thumbnails*' -ignore 'Name [Tt]rash*' -ignore 'Name *.backup*' -ignore 'Name *~' -ignore 'Name .dropbox*' -ignore 'Name /proc/*' -ignore 'Name /sys/*' -ignore 'Name /dev/*' -ignore 'Name /run/*' -ignore 'Name /root/Ubuntu One/*'" >> ${SSH_ENV2}  ## line 3
   echo succeeded
   chmod 644 ${SSH_ENV} ## change permissions so cron can read SSH_ENV
   chmod 775 ${SSH_ENV2}    ## change permissions so cron can execute SSH_ENV2
   . ${SSH_ENV} > /dev/null
   ssh-add id_rsa       ## unlocks your RSA key and loads it into the ssh-agent which holds keys in memory throughout login session
}
if [ -f "${SSH_ENV}" ]; then
   . ${SSH_ENV} > /dev/null
   ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
     start_agent;
   }
else
   start_agent;
fi

Éditez la crontab de <username> pour exécuter la synchronisation toutes les 10 minutes

crontab -e

Maintenant, ajoutez les lignes suivantes à la crontab de <username>

SSH_AUTH_SOCK=/home/<username>/.ssh/environment_for_cron
*/10 * * * * /home/<username>/Documents/Scripts/unison_sync.sh
  • Assurez-vous qu’une nouvelle ligne vierge suit les deux lignes ci-dessus dans la nouvelle crontab!

Sortir avec Ctrl+x; y pour "OUI"; Enter pour confirmation. Vérifiez le fichier crontab:

crontab -l

Définir le script 1 pour qu'il s'exécute au démarrage

Utilisez Dash> Startup Applications (ou Applications> System Tools> Preferences sur Gnome) pour ajouter un nouveau programme de démarrage. Où il est écrit "Commande:", entrez:

/home/<username>/Documents/Scripts/set_ssh_env_for_cron_unison.sh

Toutes nos félicitations!

Si tout va bien, vous entrerez le mot de passe dans la clé RSA du client lors de la connexion du client et vous ne serez pas obligé de le saisir à nouveau pendant toute la session de connexion. Toutes les 10 minutes, le Client négociera automatiquement une connexion SSH sans mot de passe avec Host et Unison synchronisera /home/<username>/Desktop et //Host//home/<username>/Desktop. Votre ordinateur portable et votre ordinateur de bureau peuvent maintenant être joints dans la Sainte Synchromie.

*Détails:

Ma configuration finale communique en tant que <username> (et non root) à l'aide d'un port SSH non standard vers "Héberger" sur une adresse IP statique. L'authentification par mot de passe est désactivée sur "Hôte" (nécessitant une clé RSA pré-authentifiée), tandis que ma clé RSA sur "Client" nécessite un mot de passe pour pouvoir être utilisé (une fois par session). Ainsi, un attaquant doit deviner le port, la clé RSA et le mot de passe appropriés pour créer un shell sous le nom <username> avec "Host".

Après cette entrée de mot de passe par session de connexion, "Client" et "Hôte" se synchronisent automatiquement toutes les 10 minutes. Cette méthode fonctionnait avec la clé RSA de <username> et l'environnement [VARIABLE] de cron. **

CAVEAT! Bien sûr, si une ou les deux machines sont hors ligne, en arrêt, etc., elles ne seront pas synchronisées!

** S'il vous plaît, n'hésitez pas à nous faire savoir s'il existe une méthode plus simple utilisant une clé RSA appartenant à root sur un client ne nécessitant pas de mot de passe pour être utilisé, tandis que l'hôte refuse simultanément les connexions SSH basées sur un mot de passe.

2
jtd