#!/bin/bash # depends on sshfs fuse for ssh # smount host:dir mountpoint -- < more sshoptions > # example: smount module_load filesystem # mounted module_load net-utils # host_reachable module_load helpers module_load ssh function smount() { local user=${DEFAULT_USER:-ubuntu} local opts; local ropts; local sshopts local host; local sshcmd; local cmd local dir; local MNT; local SRC local MNTUSER; local OPTION; local OPTARG; local OPTIND while getopts ':uno:' OPTION; do # echo $OPTION $OPTARG case "$OPTION" in u) MNTUSER=$OPTARG ;; n) MNTUSER=_NONE_ ;; o) echo "adding sshfs option: $OPTARG" opts+=" -o $OPTARG" ;; *) echo unknown sshfs option $OPTION ;; esac done shift $((OPTIND - 1)) SRC=$1 MNT=$2 shift 2 if [[ ! $* =~ "--" ]]; then ropts=$* else ropts=$(sed 's/\(.*\)--.*/\1/' <<< "$*") sshopts=$(sed 's/.*--\(.*\)/\1/' <<< "$*") fi host=$(sed 's/\(.*\):.*/\1/' <<<"$SRC") dir=$(sed 's/.*:\(.*\)/\1/' <<<"$SRC") [[ ! $host ]] && { echo no remote host given, aborting; return 4; } [[ ! $dir ]] && { echo no remote directory given, aborting; return 5; } module_load array declare -a ret echo $ropts scmd="ssh -r ${ropts} ${host}" String::split ret "$($scmd)" , host=${ret[0]}; sshopts+=" ${ret[1]}"; local sshpass=${ret[2]} # echo "$host;$sshopts;$sshpass" # scmd="'$sshpass /usr/bin/ssh $sshopts'" # echo ssh command: "$scmd" # opts+=" $scmd" # remove_end_spaces "$scmd" # return # must remote spaces or sshfs fails opts+=" -o ssh_command=$(remove_end_spaces "'$sshpass /usr/bin/ssh $sshopts'")" # [[ ! $(host_reachable $host $(parse_option $sshopts -p)) ]] \ # && echo host $host not reachable, aborting mount && return 1 if [[ $(mounted $MNT) ]]; then echo "some remote already mounted at $MNT. Umount with: $ umount $MNT" else mkdir -p $MNT if [[ ! $MNTUSER == "_NONE_" ]]; then MNTUSER=${MNTUSER:-$USER} id=$(id -u ${MNTUSER}) if [[ $id ]]; then opts+=" -o uid=$id -o allow_other -o idmap=user" else echo no user ${MNTUSER} on this machine, aborting mount return 1 fi else MNTUSER="" fi opts+=" -o follow_symlinks" cmd="sshfs $host:$dir $MNT $opts" echo $cmd eval $cmd if [[ $? -gt 0 ]]; then echo "ERROR: unable to mount remote directory" echo "CMD=> $cmd" else [[ ! $MNTUSER == "_NONE_" ]] && MNTUSER=" as user $MNTUSER " || MNTUSER="" echo "mounted directory $dir from $(get_hostname_host $host)${MNTUSER}at $MNT" fi fi } function usmount() { if [[ $(mounted $1) ]]; then echo "unmounting remote file system at $1" fusermount -u $1 else echo "nothing mounted at $1, aborting unmount" fi } function mntBackup() { smount root@$1:/backup /backup/remote } function umntBackup() { usmount /backup/remote } function enable_mounts() { DIRS=($BASH_SHELL_NETWORKS_LOADED "$BASH_SHELL_HOST" "$BASH_SHELL_USER_DIR" "$BASH_SHELL_DEV") # echo DIRS "${DIRS[@]}" CDIRS=() j=0 cnt=${#DIRS[@]} for ((i = 0; i < cnt; i++)); do # echo $i of $cnt # looks in ssh/config subdirectory of each DIRS if not passed DIR="${DIRS[i]}/ssh/mounts" # echo ----- $i, ${DIRS[i]} trying $DIR [ -d $DIR ] && CDIRS[j]=$DIR j+=1 || echo no directory $DIR done # CDIRS=("${CDIRS[@]}") # echo ${CDIRS[@]} module_load file for CDIR in "${CDIRS[@]}"; do # echo $CDIR for f in $(_find -n '*.mnt' -p 'archive off' -d 0 $CDIR); do # echo "adding mounts file $f"; [[ $f ]] && source "$f" done done [[ -f "$HOME/.ssh/mounts" ]] && source "$HOME/.ssh/mounts" }