#!/bin/bash # usage: # sshcp src dest -- sshcp () { local SRC=$1 local DEST=$2 local SHOST; local DHOST local OPTS; local SOPTS # echo remaining options: $* shift 2 echo $SRC to $DEST if [[ $SRC =~ ":" ]]; then # echo source is remote SHOST=$(sed 's/\(.*\):.*/\1/' <<< "$SRC") SDIR=$(sed 's/.*:\(.*\)/\1/' <<< "$SRC") else # echo source is local SDIR=$SRC fi # echo SHOST $SHOST SDIR $SDIR if [[ $DEST =~ ":" ]]; then # echo destination is remote DHOST=$(sed 's/\(.*\):.*/\1/' <<< "$DEST") DDIR=$(sed 's/.*:\(.*\)/\1/' <<< "$DEST") else # echo destination is local DDIR=$DEST fi # echo DHOST $DHOST DDIR $DDIR [[ $DHOST && $SHOST && (! $DHOST = "$SHOST") ]] && { echo full remote copy must be same hosts; return 2; } # echo parse: $* if [[ ! $* =~ "--" ]]; then SOPTS=$* else SOPTS=$(sed 's/\(.*\)--.*/\1/' <<< "$*") OPTS=$(sed 's/.*--\(.*\)/\1/' <<< "$*") fi # echo SOPTS $SOPTS # echo OPTS $OPTS module_load array declare -a ret # echo ssh -r "$SOPTS" "${DHOST:-$SHOST}" # return module_load ssh cmd=$(ssh -r ${SOPTS} ${DHOST:-$SHOST}) # echo $cmd String::split ret "$(ssh -r ${SOPTS} ${DHOST:-$SHOST})" , local host=${ret[0]}; local opts=${ret[1]}; local sshpass=${ret[2]} [[ -d $SDIR && ! $SHOST ]] && OPTS+=" -r" if [[ $SHOST ]]; then [[ $(ssh $SOPTS $SHOST test -d $SDIR ) ]] && OPTS+=" -r" fi local cmd="$sshpass scp $opts $OPTS $([[ $SHOST ]] && echo "${host}:")$SDIR $([[ $DHOST ]] && echo "${host}:")$DDIR" echo $cmd $cmd return 0 }