#!/bin/bash # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 source "$(dirname -- "$0")/lib/ulib/auto" || exit 1 function display_help() { uecho "$scriptname: Monter un répertoire sur un hôte distant avec sshfs USAGE $scriptname [user@]host[:/path] [mountpoint] Par défaut, le répertoire distant est montée sur un répertoire avec le même nom de base que l'hôte. Si le répertoire distant est déjà monté, il est démonté. Les options -M et -U permettent de modifier le comportement par défaut. OPTIONS -M Forcer le montage -U Forcer le démontage -o OPTIONS Ajouter les options spécifiées à la commande de montage -s Equivalent à -o allow_other ou -o allow_root selon que l'on est root ou non -u USER Spécifier le user pour la connexion distante, s'il n'est pas possible de le spécifier dans l'url. En cas de conflit, la valeur dans l'url est prioritaire par rapport à cette option." } action=auto ssh=ssh options= shared= user= parse_opts "${PRETTYOPTS[@]}" \ --help '$exit_with display_help' \ -M action=mount \ -U action=umount \ -S:,--ssh: ssh= \ -o:,--options: options= \ -s,--shared shared=1 \ -l:,-u:,--user: user= \ @ args -- "$@" && set -- "${args[@]}" || die "$args" progexists sshfs || die "Ce script nécessite sshfs. Sur debian, vous pouvez l'installer avec la commande sudo apt-get install sshfs" if [ -n "$shared" ]; then if is_root; then options="${options:+"$options,"}allow_other" else options="${options:+"$options,"}allow_root" fi fi remote="$1" [ -n "$remote" ] || die "Vous devez spécifier l'hôte et le répertoire distant à monter" # userhost représente une chaine de la forme user@host # userhostc représente une chaine de la forme user@host[:[path1]] # path1 représente un chemin sans slash, e.g. path # path représente un chemin avec potentiellement des slashes, e.g. some[/path] if [[ "$remote" == */* ]]; then # remote est de la forme userhostc/[path] splitfsep "$remote" / userhost path if [ -n "$path" ]; then # remote est de la forme userhostc/path if [[ "$userhost" == *:* ]]; then # remote est de la forme userhost:[path1]/path # path=[path1]/path est pris tel quel splitfsep "$userhost" : userhost ppath path="$ppath/$path" else # remote est de la forme userhost/path # path est pris AVEC le slash, pour faire un chemin absolu path="/$path" fi else # remote est de la forme userhostc/ if [[ "$userhost" == *:* ]]; then # remote est de la forme userhost:[path1]/ # Si path1 est non vide, il est pris tel quel, mais le slash de fin # est enlevé, car il est inutile. Sinon, prendre le slash uniquement # parce que cela signifie que l'on veut monter le répertoire racine # distant. splitfsep "$userhost" : userhost ppath [ -n "$ppath" ] || ppath=/ path="$ppath" else # remote est de la forme userhost/ # path est pris AVEC le slash, pour faire un chemin absolu path=/ fi fi else # remote est de la forme userhost[:[path1]] splitfsep "$remote" : userhost path fi splituserhost "$userhost" cuser host [ -n "$user" ] || user="$cuser" [ -n "$user" ] || user="$USER" [ -n "$host" ] || die "Vous devez spécifier l'hôte distant à monter" mountpoint="$2" [ -n "$mountpoint" ] || mountpoint="$host" mountpoint="$(abspath "$mountpoint")" mkdir -p "$mountpoint" || die if [ "$action" == "auto" ]; then if mount | grep -q "$mountpoint"; then action=umount else action=mount fi fi if [ "$action" == "umount" ]; then if fusermount -u "$mountpoint"; then echo "Volume $mountpoint démonté avec succès" rmdir "$mountpoint" 2>/dev/null exit 0 fi elif [ "$action" == "mount" ]; then if sshfs "$user@$host:$path" "$mountpoint" -o ssh_command="$ssh"${options:+",$options"}; then echo "Volume $user@$host:$path monté avec succès sur $(ppath "$mountpoint")" exit 0 else rmdir "$mountpoint" 2>/dev/null fi fi