Unison et MSYS sont dans le même bateau
Par Jean-Seb le lundi 21 décembre 2009, 19:07 - Tools - Lien permanent
Vous utilisez MS-Windows, comme des millions d'autre victimes (et moi,
et moi, et moi).
Vous utilisez également MSYS (comme... euh... moi.)
Mais avec MSYS, Unison (le synchroniseur de fichiers) est rétif.
MSYS va apprendre que l'ordinateur est fait pour servir l'homme, et non
l'inverse (muhaHAHAHAA!)
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).
- La version 0.60 est disponible sur le site officiel.
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
- Son vrai petit nom est
- 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.27dans 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\n" 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\n", 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"