133 lines
4.2 KiB
Bash
Executable File
133 lines
4.2 KiB
Bash
Executable File
#!/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
|