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/ulib" || exit 1
 | |
| urequire DEFAULTS
 | |
| 
 | |
| 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."
 | |
| }
 | |
| 
 | |
| progexists sshfs || die "Ce script nécessite sshfs"
 | |
| 
 | |
| 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"
 | |
| 
 | |
| 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
 | 
