®om's blog { un blog libre }

SSHFS inversé (rsshfs)

SSHFS permet de monter un répertoire d’une machine distance dans l’arborescence locale en utilisant SSH :

sshfs serveur:/répertoire/distant /répertoire/local

Mais comment monter un répertoire local sur une machine distante ?

Une solution simple serait de se connecter en SSH sur la machine distante et d’exécuter la commande sshfs classique.

Mais d’abord, ce n’est pas toujours directement possible : la machine locale peut ne pas être accessible (non adressable) depuis la machine distante. Ça se contourne en créant un tunnel SSH utilisant la redirection de port distante (option -R).

Et surtout, ce n’est pas toujours souhaitable : cela nécessite que la clé privée autorisée sur la machine locale soit connue de la machine distante. Or, dans certains cas, nous ne voulons pas qu’une machine esclave puisse se connecter à notre machine maître.

Reverse SSHFS

En me basant sur la commande donnée en exemple, j’ai donc écrit un petit script Bash (rsshfs, licence GPLv3) qui permet le reverse SSHFS :

(disponible également sur github)

git clone http://git.rom1v.com/rsshfs.git
cd rsshfs
sudo install rsshfs /usr/local/bin

Les paquets sshfs et fuse doivent être installés sur la machine distante (et l’utilisateur doit appartenir au groupe fuse). Le paquet openssh-sftp-server doit être installé sur la machine locale.

Son utilisation se veut similaire à celle de sshfs :

rsshfs /répertoire/local serveur:/répertoire/distant

Comme avec sshfs, /répertoire/distant doit exister sur serveur et doit être vide.

Il est également possible de monter le répertoire en lecture seule :

rsshfs /répertoire/local serveur:/répertoire/distant -o ro

Contrairement à sshfs, étant donné que rsshfs agit comme un serveur, cette commande ne retourne pas tant que le répertoire distant n’est pas démonté.

Pour démonter, dans un autre terminal :

rsshfs -u serveur:/répertoire/distant

Ou plus simplement en pressant Ctrl+C dans le terminal de la commande de montage.

Amélioration

J’ai choisi la facilité en écrivant un script indépendant qui appelle la commande qui-va-bien.

L’idéal serait d’ajouter cette fonctionnalité à sshfs directement.

Commentaires

erdnaxeli

Pas mal. Ce que j’aimerais bien, c’est un outils pour utiliser une connexion ssh déjà existante.

Je m’explique avec un exemple. Je me suis connecté sur une machine, et je voudrais copier un fichier du serveur vers ma machine (ou vice versa). Je pourrais ouvrir un autre terminal et lancer un scp, mais comme je suis un gros flemmard je me dis que vu que j’ai déjà une connexion ssh, je pourrais faire simple un :

scp --using-current-connexion monfichier mamachine:monfichier

ou équivalent dans le shell distant.

Je me pencherais dessus un jour (peut être).

erdnaxeli

Bon en fait j’aurais pu chercher un peu : http://zssh.sourceforge.net/.

tata yoyo

salut, j’aime bien l’idée mais cela ne marche pas chez moi avec l’erreur

fuse: unknown option `slave'

sur la machine locale c’est une archlinux avec fuse 2.9.3-2 et la machine distante une ubuntu 12.04 avec fuse 2.8.6

++

tata yoyo

ca semble venir du sshfs (version 2.3) de l’ubuntu qui ne connait pas cette option. si je la retire du script rssfs j’ai l’erreur

read: Connection reset by peer
®om

@tata yoyo

salut, j’aime bien l’idée mais cela ne marche pas chez moi avec l’erreur

fuse: unknown option `slave'

sur la machine locale c’est une archlinux avec fuse 2.9.3-2 et la machine distante une ubuntu 12.04 avec fuse 2.8.6

Il te faut l’option slave sur la machine distante, chez moi j’ai la 2.9.0 (Debian Wheezy).

®om

@erdnaxeli

Bon en fait j’aurais pu chercher un peu : http://zssh.sourceforge.net/.

Ah, sympa !

®om

@bellard J’aime ton idée d’utiliser un fichier fifo à la place de dpipe, ça permet de supprimer la dépendance vers le paquet vde2. J’ai donc fait la même modif.

Par contre, je ne sais pas si tu as testé ton script, mais il ne fonctionne pas. Remplacer sur la ligne 8 case "$2" par case "$1" résout le problème.

Aussi, ton découpage de rhost et rpath ne fonctionne pas si le chemin distant contient un “:” (je te l’accorde, c’est rare).

®om

@bellard Il reste un problème avec le “:“ : s’il n’est pas présent, le chemin prend la même valeur que le nom du serveur. Par exemple :

rsshfs /local/folder server

va monter /local/folder dans server:server. J’avais passé un peu de temps à trouver une commande en une ligne qui marchait dans tous ces cas, mais ton script n’est pas en Bash ;-)

1- Comment comprendre

rsshfs /local/folder server

y aurait-il un remote path par défaut ?

2- sftp-server -R permet de ne plus dépendre du bon fonctionnement de ‘-o ro’ avec le sshfs distant.

®om

@bellard

1- Comment comprendre

rsshfs /local/folder server`

y aurait-il un remote path par défaut ?

En théorie, ça devrait renvoyer une erreur. Néanmoins, mon script le comprend comme :

rsshfs /local/folder server:

c’est-à-dire le répertoire HOME de l’utilisateur (ce qui va renvoyer une erreur car il n’est probablement pas vide).

@bellard 2- sftp-server -R permet de ne plus dépendre du bon fonctionnement de ‘-o ro’ avec le sshfs distant.

Merci, je ne connaissais pas. Je l’ai implémenté.

Poster un commentaire

Nom : (requis)
E-mail : (requis, non publié)
Site web : (optionnel)

Les commentaires sont formatés en markdown.