====== SSH Filesystem ====== Site officiel : [[http://fuse.sourceforge.net/sshfs.html]] Origine de la documentation : [[http://doc.ubuntu-fr.org/sshfs]] ===== A quoi ça sert ? ===== SshFS sert à monter sur son système de fichier, un autre système de fichier distant, à travers une connexion ssh, le tout avec des droits utilisateur. L'avantage est de manipuler les données distantes avec n'importe quel gestionnaire de fichier (Nautilus, Konqueror, ROX, ou même la ligne de commande), ce qui est bien plus pratique que la commande scp couplée avec ssh. SshFS apporte ce qui pouvait manquer à certains utilisateurs Windows qui utilisaient WinSCP. ===== Installation ===== Tout d'abord, il vous faudra installer et configurer FUSE, dont dépend SshFS. FUSE est installé en même temps que SSHFS sur Debian. Ensuite, un simple : # apt-get install sshfs Il faut veiller à ce que les utilisateurs potentiels de sshfs fassent bien partie du groupe [[http://wiki.druidesmetal.org/doku.php?id=fuse|fuse]]. Il est probable, surtout si vous utilisez l'authentification ssh par certificat, que vous deviez re-démarrer la machine… Vous obtiendrez l'erreur failed to open /dev/fuse: Permission denied si les points précédents ne sont pas vérifiés. Voilà, vous pouvez utiliser SshFS ! ===== Prérequis ===== Il faut faire un échange de clé SSH entre le serveur client et le serveur distant # ssh-keygen -t rsa et l'autoriser sur le serveur en rajoutant le contenu **/root/.ssh/id_dsa.pub** du poste client dans **~/.ssh/authorized_keys** du poste serveur, **pour chaque compte utilisateur auquel il sera possible de se connecter**. Si vous voulez faire un échange de clé avec un autre user, la commande est la même. ===== Utilisation en mode Console ===== Rien de plus simple maintenant : # mkdir tmp # sshfs toto@lecole.fr:Document/Blagues tmp Pour démonter, vérifier que rien n'accède au point de montage (fichier ouvert ou gestionnaire de fichier), et effectuer la commande : # fusermount -u tmp Remarque: Pour monter un disque dans un répertoire autre que le home afin de faire une sauvegarde du home par exemple il faut tout d'abord créer ce dossier puis autoriser son accès (en remplaçant your-username par votre login): # mkdir /mnt/backup # chown your-username /mnt/backup Le reste de la procédure est identique Fusauto: Il est possible de monter/démonter en une seule commande simple, voir la documentation. # fusauto /point/de/montage ===== Utilisation via /etc/fstab ===== si vous montez souvent les mêmes répertoires, il peut être sympa de les entrer dans la fstab : # mkdir /mnt/mon_rep # chmod 0777 /mnt/mon_rep # vi /etc/fstab et il faut y rajouter la ligne sshfs#user@machine:/dossier/distant /mnt/mon_rep fuse rw,auto,user,allow_other 0 0 Ensuite, il faut modifier le fichier /etc/rc.local, car le réseau est monté bien après le fstab. # vi /etc/rc.local sleep 20 mount -a Sur une Debian, vous pouvez modifier le fichier /etc/network/interfaces au lieu du fichier /etc/rc.local. Ajouter dans la déclaration de la carte réseau la ligne suivante : up /bin/mount -a ===== Utilisation via Autofs ===== ==== Objectifs ==== Le montage manuel ou par fstab a plusieurs inconvénients. Le principal, c'est qu'il n'est pas toujours possible de rendre le montage automatique : mais si lors du montage vous n'êtes pas encore connecté (en wifi par exemple), et bien le montage ne se fait pas, et il faut effectuer le montage manuellement. Et dans tous les cas, le démontage aussi. Un autre inconvénient, moins important, est que même si vous n'utilisez pas les dossiers montés, ils restent montés et consomment des ressources. autofs permet de résoudre ces 2 problèmes. ==== Installer ==== # apt-get install autofs ==== Configuration ==== Contrairement au montage NFS par autofs, SSHFS a besoin d'une authentification, et cette authentification doit se faire "automatiquement". Pour cela, il faut utiliser le système de clés publiques/privées pour l'authentification ssh, et utiliser l'user-agent (par ssh-add) si vous avez défini une passphrase. Pour cela reportez-vous à la page ssh. Le problème avec autofs, c'est qu'il s'exécute en root. Il faut donc créer une paire de clés publiques/privées pour l'utilisateur root sur le client: # ssh-keygen -t rsa et l'autoriser sur le serveur en rajoutant le contenu **/root/.ssh/id_dsa.pub** du poste client dans **~/.ssh/authorized_keys** du poste serveur, **pour chaque compte utilisateur auquel il sera possible de se connecter**. Maintenant que les problèmes de connexions ssh sont résolus, supprimez (ou commentez) dans /etc/fstab les montages que vous voulez gérer par autofs (si vous en aviez écrit auparavant). Ensuite, éditez **/etc/auto.master**, pour y ajouter la ligne : /net /etc/auto.sshfs --timeout=30,--ghost L'option ghost permet de toujours afficher les dossiers, même lorsqu'ils ne sont pas montés. Il ne reste plus qu'à double-cliquer dessus dans le navigateur pour les monter automatiquement. Créez alors un fichier **/etc/auto.sshfs** : mondossier -fstype=fuse,port=22,rw,allow_other :sshfs\#votrelogin@192.168.0.1\:/media/share Le montage se fera alors dans /net/mondossier (qu'il faut créer auparavant ), et pointera vers la machine 192.168.0.1 sur le répertoire /media/share. Vous pouvez dans ce même fichier écrire plusieurs lignes pour chacun de vos points de montage. Il ne reste plus qu'à lancer le serveur : # /etc/init.d/autofs start Si vous avez défini une passphrase pour la clé de l'utilisateur root, vous devrez enregistrer auparavant (une seule fois pour chaque session) cette clé dans l'user-agent, par ssh-add. Malheureusement, après avoir entré une clé dans ssh-add, il faut relancer le serveur autofs: # /etc/init.d/autofs restart ==== Vérification montages ==== J'ai fait un script à placer en crontab pour vérifier la présence des montages SSHFS et au besoin il les remonte. === Script === #!/bin/bash FUSEMOUNT=`cat /etc/fstab | grep fuse | awk '{print $2}'` FUSEHOST=xxxxx.xxxxx PING=`ping -c 1 -q ${FUSEHOST} | tail -2 | head -1 | awk '{print $6}' | sed -e 's/%//g'` if [ ${PING} -eq 0 ] then # Ping OK ... Verification des montages for FMNT in ${FUSEMOUNT} do fusermount -u ${FMNT} if [ $? -eq 1 ] then # Montage absent ... on le monte mount ${FMNT} fi done fi === Crontab === **/5 * * * * root /usr/local/bin/fuse_check.sh > /dev/null