Connecter avec FUSE des dossiers distants accessibles via OpenSSH sur des postes Ubuntu

De e-glop
Révision datée du 7 juin 2010 à 13:29 par BeTa (discussion | contributions)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)

Pré-requis

Serveur

Serveur OpenSSH, sous UNIX de préférence...

Postes clients

Machines sous Ubuntu GNU/Linux, fonctionnant avec Gnome en interface graphique.

Préparer le terrain à FUSE

Pour permettre de monter facilement un dossier, il faut créer le script fusauto sur votre système. L'emplacement /usr/local/bin/fusauto est à privilégier. Voici le script :

#! /usr/bin/env python
# coding: utf-8
#
# fusauto
# auto mount directory with fuse by reading a config file
#
# Copyright (C) Nicolas Albert <nicolas_albert_85@yahoo.fr>
#
# Version 0.0.1
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 
import sys, os
 
def runconf(conf, path):
  file = open(conf, "r")
  act = {}
  for line in file.readlines():
    if not line.startswith('#'):
      part = line[:-1].partition('=')
      act[part[0]] = part[2]
  file.close()
  if 'bin' in act:
    if not 'from' in act: act['from']='none'
    if not 'opt' in act: act['opt']=
    os.system("%s %s %s -o nonempty %s"%(act['bin'], act['from'], path, act['opt']))
 
def getfuses():
  mtab = open("/etc/mtab", "r")
  fuses =[ line for line in mtab.readlines() if line.split()[2] == "fuse" ]
  mtab.close()
  return fuses
 
def alreadymount(path):
  for fuse in getfuses():
    fd = fuse.split()[1]
    if fd == path or fd == os.getcwd()+'/'+path:
      return True
  return False
 
def umount(path):
  os.system("/bin/fusermount -u "+path)
 
if __name__ == "__main__":
  if len(sys.argv) == 2 and os.path.isdir(sys.argv[1]):  
    if alreadymount(sys.argv[1]):
      umount(sys.argv[1])
    else:
      conf = sys.argv[1]+'/fusauto.conf'
      if os.path.isfile(conf):
        runconf(conf, sys.argv[1])
      else:
        print conf,"is required"
  else:
    print "One directory is required"


Créez également un script automatisant le démontage de volumes FUSE, dans /usr/local/bin/fuserumount :

#/bin/bash
fusermount -u $1

N'oubliez pas de rendre exécutable vos fichiers nouvellement créé :

chmod +x /usr/local/bin/fusauto /usr/local/bin/fuserumount

Préparer OpenSSH côté serveur

Sur vos postes clients, générez simplement des clés SSH avec la commande suivante, en laissant toutes les réponses aux questions qui vous seront posées vierges :

ssh-keygen

Ensuite, recopier le contenu du fichier .ssh/id_rsa.pub généré dans le fichier .ssh/authorized_keys du le compte qui sera utilisé sur le serveur pour accéder aux fichiers.

Tentez ensuite une connexion directe via SSH pour valider votre manipulation :

ssh [utilisateur@]SERVEUR

Monter aisément un dossier distant

Créez deux liens symboliques :

ln -s /usr/local/bin/fusauto ~/.gnome2/nautilus-scripts/connecter
ln -s /usr/local/bin/fuserumount ~/.gnome2/nautilus-scripts/déconnecter

Créez le point de montage (dans votre répertoire personnel par exemple) :

mkdir ~/MONTAGE

Ajoutez la configuration de votre accès distant dans votre répertoire, à travers le fichier ~/MONTAGE/fusauto.conf :

# fusauto config file
# lines start with # are commentaries

# process must be run (must exist)
bin=/usr/bin/sshfs

# remote folder (default : none)
from=SERVEUR:/home

# fuse options (default : )
opt=-o follow_symlinks,transform_symlinks,workaround=rename,idmap=user

N'oubliez pas de changer la ligne "remote folder" pour l'adapter à vos besoins (serveur et dossier distant).

Automatiser le process

Pour automatiser le montage de votre dossier distant, il est possible de l'ajouter dans les "Applications au démarrage" de votre session. De manière plus stricte, créez un fichier .config/autostart/fusauto.desktop avec pour contenu :

[Desktop Entry]
Type=Application
Name=Connexion serveur
Exec=/usr/local/bin/fusauto ~/MONTAGE
Icon=system-run
Comment=

Il restera à voir comment démonter automatiquement ce dossier à la déconnexion de la session.