Edit: 01/10/2007: correction bug: ajout d'un ! pour la création du mount point s'il n'existe pas.
EDIT: bugs corrigés pour le $mount_point défini en dur à certains endroits, ajout d'un raccourcis vers le dossier monté sur le bureau, création du mount point s'il n'existe pas et quelques améliorations.
Salut à tous,
comme promis il y a peu, voici un petit script qui vous permettra d'un clic de monter un dossier (répertoire) distant via sshfs.
sshfs est un système de fichiers basé sur fuse (cf
http://fuse.sourceforge.net/ ) qui permet, si la machine distante vous autorise un accès ssh, de monter un répertoire distant sur le système de fichier local.
Contrairement à Gnome VFS, KDEvfs ou autre VFS, fuse réalise un véritable montage au niveau système de fichiers, ce qui fait que tout programme (démarré par l'utilisateur possédant le montage) peut accéder aux fichiers de manière transparente.
sshfs (basé sur ssh) est sécursé, crypté et sûr au moment où j'écris ce post.
De plus il est impossible pour tous les autres utilisateurs, y compris root, d'accéder (lire ou écrire) au contenu du dossier monté avec sshfs, le listage des fichiers est tout aussi impossible: seul l'utilisateur qui effectue le montage peut accéder à celui-ci (un su - utilisateur est donc le seul moyen d'"espionner").
Il existe un moyen de ne plus entrer de mot de passe en important la clef publique de l'utilisateur de la machine locale sur la machine distante dans le dossier perso de l'utilisateur local (c'est un peu compliqué à expliquer mais c'est pas le sujet ici)
je ne mets en place que la partie "avec mot de passe" à charge à quelqu'un d'autre de traîter la partie "avec clefs".
Après des tests en local (machine locale: Pentium M740, machine distante P3 M 128Mo RAM et 2 disques en RAID1 soft en FireWire), j'ai pu constater que le sshfs a des performances supérieures (et de loin) aux montages Samba et s'approche de peu des montages NFS.
Donc sshfs (fuse) = rapidité, sécurité, et maintenant simplicité!
pour ce script vous aurez besoin (traduc de ce qu'il y a dans le script):
0) installer zenity ("interface graphique" pour bash)
1) sshd doit être lancé côté serveur distant
2) l'utilisateur avec lequel vous vous connectez au serveur distant (distant_user) doit exister sur le serveur distant et doit être dans la liste des utilisateurs autorisés dans /etc/ssh/sshd_config (AllowUsers)
3) le port SSH (22 TCP par défaut) du serveur distant doit être accessible (voir le NAT ou/et le firewall)
4) même chose que précedemment
5) l'utilisateur distant doit avoir les droits AU MINIMUM en lecture sur le dossier distant.
6) un client ssh doit être installé sur la machine locale (pas obligé mais pratique pour tester)
7) fuse doit être installé sur la machine locale
8) le module fuse doit être chargé (en root: modprobe fuse)
9) fuse-sshfs doit être installé sur la machine locale
10) l'utilisateur local doit avoir les droits de lecture/écriture sur le point de montage local
11) le dossier qui sert de point de montage local doit être vide
12) l'utilisateur local doit être dans le groupe fuse local pour accéder au device /dev/fuse
voici le script (très simple!) qui permet de monter et démonter:
######### settings ####################
# mount point without ANY / at the end
mount_point="$HOME/mnt-sshfs"
# distant user
distant_user='guest'
# distant server IP or DN
distant_server='monserveur.fr'
# which port will sshfs connect to
distant_port='123'
# distant directory which will be mounted
distant_directory='/files'
[ ! -d $mount_point ] && mkdir -p $mount_point
########## checking and mounting ##################
if [ `mount | grep $mount_point | wc -l` -gt 0 ]
then
zenity --question --title "Déjà monté" --text "Le dossier est déjà monté sur $mount_point. Le démonter ?"
case $? in
0) echo yes;
fusermount -u $mount_point
if [ `mount | grep $mount_point | wc -l` -gt 0 ]
then
zenity --error --title "Démontage échoué" --text "Echec: Le dossier $mount_point n'a pas été démonté."
prog_using=`/usr/sbin/lsof | grep $mount_point | awk '{print $9 " (par " $1 " pid " $2 " de " $3 ")"}'`
zenity --warning --title "Fichiers en cours d'utilisation" --text "Les fichiers suivants sont utilisés :\n $prog_using \n veuillez fermer ces fichiers puis réessayez."
else
rm -f ~/show_sshmount.sh
rm -f ~/Bureau/sshfsmount.desktop
zenity --info --title "Démontage terminé" --text "Le dossier distant a été démonté de $mount_point."
fi ;;
1) echo no;;
255) echo echap;
esac
else
if [ `ls -l $mount_point | grep -v total | wc -l` -gt 0 ]
then
zenity --error --title "Erreur" --text "Le dossier $mount_point n'est pas vide, montage impossible sur un dossier non vide"
else
sshfs $distant_user@$distant_server:/$distant_directory $mount_point -p $distant_port
if [ `mount | grep $mount_point | wc -l` == 0 ]
then
zenity --error --title "Erreur" --text "Le dossier distant n'a pas été monté."
else
echo "nautilus --no-desktop --browser $mount_point" > $HOME/show_sshmount.sh
chmod 500 $HOME/show_sshmount.sh
echo "[Desktop Entry]
Encoding=UTF-8
Version=1.0
Type=Application
Terminal=false
Name[fr_FR]=$mount_point $distant_user
Exec=$HOME/show_sshmount.sh
Comment[fr_FR]=Ouvrir le montage SSHFS
Icon[fr_FR]=/usr/share/pixmaps/redhat-internet.png
Name=$mount_point $distant_user
Comment=Ouvrir le montage SSHFS
Icon=/usr/share/pixmaps/redhat-internet.png" > $HOME/Bureau/sshfsmount.desktop
zenity --info --title "Montage terminé" --text "Le dossier distant a été monté sur $mount_point."
fi
fi
fi
Pour l'instant ce script n'est pas utilisable avec des paramètres en ligne de commande (facilement implémentable), et ne supporte qu'un seul montage.
Pour le sshfs, il demande le mot de passe tout seul!
Sinon ce script est librement utilisable et modifiable, n'oubliez pas de poster vos améliorations et modifications pour en faire profiter toout le monde.
J'avais pensé faire un deuxième script qui pourrait gérer une liste de montages, et utiliserait celui-ci pour les monter/démonter.
Et pourquoi pas un moyen pour reconnecter le montage en cas de difficulté dûes à des déconnexion internet qui fait que parfois le montage se bloque.
C'est tout pour l'instant (et suffisant pour l'usage que j'en ai).
Pour toute demande d'explications... postez!
à+
Denis
edit: ajout de la directive 12) sur le groupe local fuse