Il y a ce qu'on a ...

Ce qu'on a
  • Pour le moment, nous pouvons utiliser uniquement Unison sous la forme d'un serveur lancé avec la commande
    • unison --socket <port en écoute>
  • Le client Unison est le même programme, mais lancé avec des paramètres différents. Il sera utilisé depuis une autre machine pour se connecter à son serveur.
  • Ce n'est pas une bonne solution, pour trois raisons:
    • Il faut lancer Unison en écoute le serveur à chaque utilisation, ou pire, le laisser tourner en permanence en écoute.
    • Les communications ne sont pas chiffrées.
    • Il n'y a pas d'authentification, et changer de port pour l'écoute du serveur n'est qu'un pis-aller.


Ce qu'on aimerait que ça devienne
  • Utiliser le mode commandes ssh de Unison, qui lance lui même le serveur, et fait transiter les données dans un canal crypté.
    • Les inconvénients de la situation où Unison est figé en écoute sont supprimés.



Configuration logicielle

openssh de MSYS
  • Ma version de openssh est la 4.7
    • Sans vouloir gâcher un long suspense, nous n'utiliserons pas openssh, mais plink de putty.
    • Je laisse toutefois mon cheminement avec openssh. Un courageux pourra peut être compléter dans les commentaires.


putty 0.59
  • Uniquement pour utiliser plink (mais putty est également un excellent émulateur de terminal).


Unison en interface texte
  • Il s'agit de la version 2.27
  • Pour nos tests, nous allons utiliser la version interface texte de Unison.
    • Le passage à l'interface graphique de Unison sera abordé à la fin de cet article.


Profil pour les tests
  • Le client d'où est lancé la commande est un banal Windows.
  • Le serveur est un banal Linux, avec Unison correctement installé. (ip: 192.168.1.1)
  • Un fichier profile se trouvera dans votre home, dans le sous-répertoire .unison
  • Exemple de fichier profile valide, situé dans ~/.unison/default.prf

# Unison preferences file
root = c:\msys\home\jseb\coding
root = ssh://jseb@192.168.1.1//home/jseb/coding


  • Vous remarquerez que l'encodage des répertoires côté Windows se fait avec des antislashes, ce qui est logique quand on réfléchit trente secondes.
    • Je dis ça, car mon premier essai m'a pris exactement vingt neuf secondes.


Premier lancement
  • Unison est lancé avec les paramètres suivants:
    • ./"Unison-2.27.57 Text.exe" -debug verbose
  • Je passe le début du log. La fin est intéressante:

Contacting server...
[remote] Shell connection: ssh (ssh, -l, jseb, 192.168.1.1, -e, none, unison, -server)
Uncaught exception Unix.Unix_error(20, "create_process", "ssh")

  • On dirait un problème avec ssh, pas vrai Holmes ?
    • Watson, vous m'étonnerez toujours.



Utiliser ssh avec Unison

Vérification (sur l'air de ne négligeons aucune possibilité)
  • La commande ssh existe pourtant dans MSYS.
  • Première chose, s'assurer de son bon fonctionnement.

$ ssh jseb@192.168.1.1 ls
Password: 
(et une jolie liste de fichiers s'affiche)

  • Pas de problèmes de ce côté là.
  • Les paramètres passés par Unison ne sont probablement pas compris par ssh.


Voyons voir ces paramètres...
  • Pour rappel, voici la chaine de paramètres utilisée par Unison (vu dans les logs plus haut)
    • ssh, -l, jseb, 192.168.1.1, -e, none, unison, -server
  • Nous allons faire un essai à la main

$ ssh jseb@192.168.1.1 unison -server
Password: 
bash: unison: command not found

  • Ahah! Effectivement, Unison ne s'appelle pas Unison sur mon serveur, pour des raisons historiques (aheeeem!).
    • Son vrai petit nom est unison-2.27
  • Hola! Stop! Je vous ai vu! Pas de renommage du binaire sur le serveur, espèce de sauvage!
    • Le fichier profile peut se configurer afin de préciser la commande à lancer.
    • Il suffit d'ajouter: servercmd = unison-2.27 dans le profil.


Avec les nouveaux paramètres...
  • On relance Unison, toujours en mode debug

$ ./Unison-2.27.57\ Text.exe -debug verbose
 (...)
[remote] Shell connection: ssh (ssh, -l, jseb, 192.168.1.1, -e, none, unison-2.27, -server)
Uncaught exception Unix.Unix_error(20, "create_process", "ssh")

  • C'est un peu mieux, mais ce n'est toujours pas ça.


Passer différemment les paramètres à ssh
  • Tout ça sent à plein nez un problème de paramètres passés n'importe comment à ssh.
  • Nous savons comment nous voulons les passer (ligne de commande ci-dessus).
  • Unison est un programme bien fait, il permet de spécifier la commande ssh.
  • Il suffit d'utiliser sshcmd dans le profil.
  • Nous ajoutons donc:
    • sshcmd = c:\msys\home\jseb\.unison\sshcmd.bat
  • Bien sûr, il faut un fichier sshcmd qui va contenir la commande ssh correctement paramétrée.
    • A des fins de test, nous utilisons une commande qui va afficher les paramètres passés.
  • sshcmd.bat contient donc pour l'instant:
    • @echo 0=%0 1=%1 2=%2 3=%3 4=%4 5=%5 6=%6 7=%7 8=%8 9=%9
    • Notez l'arobase au début de la commande, c'est obligatoire.
  • Plus qu'à relancer Unison pour voir ce que cela donne.

$ ./Unison-2.27.57\ Text.exe 
Contacting server...
Fatal error: Received unexpected header from the server:
 expected "Unison 2.27
" but received "0=c:\msys\home\jseb\.unison\sshcmd.bat 1=-l 2=jseb 3=192.168.1.1 4=-e 5=none 6=unison-2.27 7=-server 8= 9=\013
", which differs at "0".

  • Les paramètres importants sont donc le second et le troisième (le nom d'utilisateur et l'ip), ainsi que le sixième et le septième (commande
  • Nous pouvons tout de suite modifier la commande ssh.
  • sshcmd.bat devient donc:
    • @c:\msys\bin\ssh -l %2 %3 -e none %6 %7


Et alors ? Rien à tirer de openssh
  • Quand on relance Unison, la connexion reste en attente et ssh tourne dans le vide sur le poste client.
  • Il y a bien du dialogue avec le serveur, une écoute avec tcpdump le montre.
  • Il s'agit d'un problème d'attente du mot de passe ssh, qui n'est pas transmis sur le shell msys par ssh.
  • Nous pourrions tenter des générer une clé privé et de nous connecter sans mot de passe, mais je trouve cette solution dangereuse.
    • Vous n'êtes pas obligé d'être d'accord. Vous pourriez stocker votre clé privé sur une clé USB qui ne vous quitterait pas, résolvant les problèmes de stockage de la clé sur un ordinateur en accès libre.
  • Pour ma part, j'ai une approche différente : utiliser plink en lieu et place de openssh.
  • Attention aux essais avec openssh et unison. Quand ssh reste dans un état bloqué, un ctrl+c rend la main au shell, mais ssh reste en mémoire. Pensez à le tuer avec le gestionnaire des tâches.



plink, mon sauveur

plink ?
  • plink est un utilitaire livré avec putty (un émulateur de terminal déja évoqué ci-dessus).
  • Son fonctionnement est analogue à la fonction ssh, il peut même servir pour des sessions interactives.


En avant avec plink
  • Pour l'utiliser, il suffit de modifier le fichier sshcmd.bat et d'adapter les paramètres.
    • Voici le nouveau contenu du fichier:

REM fichier sshcmd.bat
REM %2 = nom d'utilisateur , %7 = mot de passe ssh
REM %3 = ip serveur, %8 = unison-2.27, %9 = -server

@C:\putty\plink -ssh -l %2 -pw %7 %3 %8 %9


  • -pw : ce paramètre sert à spécifier un mot de passe en ligne de commande, et à éviter le lock rencontré avec OpenSSH.
  • Il faut préciser que la commande ssh aura des arguments, on lance donc Unison avec ces paramètres:
    • ./"Unison-2.27.57 Text.exe" -sshargs "-pw mot_de_passe"
  • Si vous rencontrez des problèmes, vous pouvez relancer la commande ci-dessus en debug verbose.
    • ./"Unison-2.27.57 Text.exe" -sshargs "-pw mot_de_passe" -debug verbose
    • Il s'agira probablement d'un problème d'ordre de paramètres (vérifiez bien la chaine de connexion ssh).



Bon et cette interface ?

  • L'interface texte est pratique, mais l'interface GTK est encore plus pratique.
    • Oui je sais. clic clic clic. Bon. Personne n'est parfait.
  • Si vous avez la lib GTK installée, passer à l'interface graphique de Unison ne devrait pas poser trop de problèmes.
  • Il suffit de préciser son path dans le script d'invocation de Unison.
  • Voici un exemple de script, que j'ai appellé unison, et que j'ai placé dans le /bin de msys.

#!/bin/sh
#nom de ce script: /bin/unison

stty -echo
echo -n "entrez votre mot de passe: "
read p
stty echo

#echo $PATH
"$unison_gtk" -sshargs "-pw $p" 

  • Vous remarquerez qu'on passe le mot de passe dans une variable, après l'avoir demandé au lancement.
    • L'écho local du clavier est bloqué pendant la saisie, au cas où un malfaisant vous regarderait taper.
    • Un script plus complet (pour ceux qui comme moi n'ont pas GTK dans le PATH) est proposé à la fin de cet article.



Synchro : ok

  • A ce stade, vous êtes normalement un codeur heureux.
  • Terminé les fichiers qui se promènent en clair sur le réseau.
  • Et pour ceux qui n'aiment ni lire, ni comprendre, voici le résumé du résumé.


Le profil
  • Il se trouve dans ~/.unison/votre_profil_unison.prf
    • C'est ici qu'on précise le nom de l'exécutable Unison côté serveur, ainsi que la commande de remplacement ssh.
    • Par défaut, Unison utilise le profil nommé default.prf

# Unison preferences file
servercmd = unison-2.27
sshcmd = c:\msys\home\jseb\.unison\sshcmd.bat@@
root = c:\msys\home\jseb\coding
root = ssh://jseb@192.168.1.1//home/jseb/coding


La commande de remplacement ssh
  • Ce batch MS-DOS est invoqué par Unison, qui utilise le contenu du paramètre sshcmd, défini dans le profil.
    • N'oubliez pas l'arobase avant la commande.

@C:\putty\plink -ssh -l %2 -pw %7 %3 %8 %9


Script de lancement (avec support GTK)
  • Placez le dans votre path, ou dans /bin, il s'y trouvera fort bien.

#!/bin/sh
#nom de ce script: /bin/unison

stty -echo
echo -n "entrez votre mot de passe: "
read p
stty echo

#attention , pas d'espace autour de '=' dans une affectation!
unison_gtk="/c/Unison-2.27.57/Unison-2.27.57 Gtk+.exe"
lib_gtk="/c/Program Files/Fichiers communs/GTK/2.0/bin/"
PATH="$PATH":"$lib_gtk"

#les gens qui ont une espace dans leur mot de passe protègeront la variable $p :
# -sshargs "-pw \"$p\""
# Merci Fred pour la remarque.
"$unison_gtk" -sshargs "-pw $p"