140 lines
3.8 KiB
Bash
140 lines
3.8 KiB
Bash
#!/bin/bash
|
|
|
|
# this will superceed the ssh binary in order to source all the config files
|
|
# "USAGE: ssh <run/setup options> host <SSH options> <commands to run on remote>"
|
|
# put any additional SSH (man ssh) options after the host, aborting"#
|
|
|
|
# if using ssh in another command use -r flag
|
|
# this returns a string that can be parsed into an array
|
|
# the array has three elements
|
|
# 0 - host (mayb include user)
|
|
# 1 - all ssh options
|
|
# 2 - an sshpass command if -p flag was used
|
|
# to user the arary do this.
|
|
#
|
|
# > module_load array
|
|
# > declare -a ret
|
|
# > String::split ret "$(ssh -p f filename -m -r test -p 32)"
|
|
# > host=${ret[0]}; opts=${ret[1]};sshpass=${ret[2]}
|
|
|
|
module_load net-utils
|
|
module_load ssh-config
|
|
|
|
ssh() {
|
|
|
|
local pw;local cfg;local opts;local mp; local sshpass; local dr
|
|
local host; local user; local script; local ret ; local key
|
|
|
|
if [[ $SSH_CONFIG ]]; then
|
|
[[ ! -f "$SSH_CONFIG" ]] && ssh_config "$SSH_CONFIG"
|
|
cfg="-F $SSH_CONFIG"
|
|
fi
|
|
|
|
# echo passed: $*
|
|
|
|
local OPTION; local OPTARG; local OPTIND
|
|
while getopts ':h:u:mdF:p:ro:k:' OPTION; do
|
|
# echo processing: option:$OPTION argument:$OPTARG index:$OPTIND remaining:${@:$OPTIND}
|
|
case "$OPTION" in
|
|
h)
|
|
host=$OPTARG
|
|
;;
|
|
d)
|
|
dr=true
|
|
;;
|
|
r)
|
|
ret=true
|
|
;;
|
|
u)
|
|
user=$OPTARG
|
|
;;
|
|
k)
|
|
[[ $(isAbsPath $OPTARG) ]] && key=$OPTARG || key=${SSH_PUB_KEYS:-$HOME/.ssh}/$OPTARG
|
|
opts+=" -o IdentitiesOnly=yes -o IdentityFile=$key"
|
|
;;
|
|
o)
|
|
opts+=" -o $OPTARG"
|
|
;;
|
|
p)
|
|
# pw=$OPTARG
|
|
#e, f, d
|
|
case "$OPTARG" in
|
|
e)
|
|
sshpass="sshpass -e "
|
|
;;
|
|
f) ;&
|
|
d)
|
|
# echo ${@[$OPTIND]}
|
|
sshpass="sshpass -$OPTARG ${@:$OPTIND:1}"
|
|
((OPTIND+=1))
|
|
;;
|
|
*)
|
|
[[ ! ( $OPTARG = "yes" || $OPTARG = "y" ) ]] && sshpass="sshpass -p $OPTARG"
|
|
;;
|
|
esac
|
|
pw=true
|
|
opts+=" -o PreferredAuthentications=password -o PubkeyAuthentication=no -o StrictHostKeyChecking=no"
|
|
;;
|
|
F)
|
|
echo "using SSH Config file at: $OPTARG"
|
|
[[ -f $OPTARG ]] && cfg="-F $OPTARG" || echo no config file at $OPTARG, ignored
|
|
;;
|
|
m)
|
|
# echo setting multipass
|
|
mp=true
|
|
;;
|
|
*) echo unknown run option -$OPTARG
|
|
echo "USAGE: ssh <setup options> host <SSH options> <commands to run on remote>"
|
|
echo "put any additional SSH (man ssh) options after the host, aborting"
|
|
return 3
|
|
# opts="$opts ${@:$OPTIND:1}"
|
|
# ((OPTIND+=1))
|
|
#echo remaining ${@:$OPTIND}
|
|
;;
|
|
esac
|
|
done
|
|
|
|
shift $((OPTIND - 1))
|
|
|
|
[[ (! $host) && $1 ]] && { host=$1;shift; }
|
|
|
|
# echo extra ssh options and the command: $@
|
|
# echo host $host
|
|
# return
|
|
|
|
[[ ! $host ]] && echo host/ip required, aborting && return 2
|
|
[[ ! $user ]] && user=$(parse_user $host)
|
|
|
|
if [[ $mp ]]; then
|
|
user=${user:-ubuntu}
|
|
[[ ! $host ]] && echo multipass host/ip required, aborting && return 2
|
|
# echo multipass host:$host user:$user
|
|
module_load multipass
|
|
ip="$(multipass_get_ip $(parse_host $host))"
|
|
[[ ! $ip ]] && echo could not resolve ip for multipass instance $1 && return 5
|
|
[[ ! $pw && ! $key ]] && opts+=" $(multipass_ssh_options)"
|
|
host="$user@$ip"
|
|
else # not an mp vm
|
|
[[ $user && (! $host =~ "@") ]] && host=$user@$host
|
|
if [[ $user && $host =~ "@" ]]; then
|
|
host=$(sed 's/.*@\(.*\)/\1/' <<<"$host")
|
|
# option takes precedence
|
|
host=$user@$host
|
|
fi
|
|
opts+=" $cfg"
|
|
fi
|
|
|
|
if [[ $ret ]]; then
|
|
# return arguments so a command can be composed elsewhere
|
|
{ echo "$host,$opts $* ,$sshpass"; return 0; }
|
|
else
|
|
# run remote commands right here
|
|
sshcmd="$sshpass $(which ssh) $opts $host"
|
|
# echo extra args: "$@"
|
|
# echo running command: $ "$sshcmd"
|
|
[[ ! $dr ]] && $sshcmd "$@" || echo $sshcmd "$@"
|
|
fi
|
|
|
|
} # end ssh
|
|
|