155 lines
2.8 KiB
Bash
155 lines
2.8 KiB
Bash
cnssh() { # Helper for sshing into Crestron devices
|
|
#
|
|
# USAGE
|
|
#
|
|
# cnssh <ip address> [command]
|
|
#
|
|
#
|
|
# OPTIONS
|
|
#
|
|
# -u <username> Specify the username to use with ssh
|
|
# Default: "Crestron"
|
|
#
|
|
# CONFIG ARRAY: cnssh_conf
|
|
#
|
|
#
|
|
# | Option | Valid Args | Default | Description |
|
|
# | ------------- | ------------- | ------------- | --------------------------------------------- |
|
|
# | uname | <string> | "Crestron" | The username for use with ssh |
|
|
# | pass | <string> | "" | The password for use with ssh (via sshpass) |
|
|
# | addr | <string> | <ip address> | The address of the remote device |
|
|
# | cmd | <string> | [command] | The command to execute on the remote device |
|
|
|
|
|
|
####
|
|
# Config init
|
|
|
|
# Initialize runtime config array
|
|
declare -A conf
|
|
|
|
# Initialize config array if it doesn't already exist
|
|
if [[ ! -v cnssh_conf[@] ]]; then
|
|
declare -A cnssh_conf
|
|
else
|
|
for opt in "${!cnssh_conf[@]}"; do
|
|
conf[$opt]=${cnssh_conf[$opt]}
|
|
done
|
|
fi
|
|
|
|
# Initialize and populate default config array
|
|
declare -A dconf
|
|
dconf=(
|
|
[method]="ssh"
|
|
[uname]="Crestron"
|
|
[pass]=""
|
|
)
|
|
|
|
# Apply defaults to running config
|
|
for opt in "${!dconf[@]}"; do
|
|
# Don't apply the default if it's already set
|
|
if [[ ! -v conf[$opt] ]]; then
|
|
conf[$opt]=${dconf[$opt]}
|
|
fi
|
|
done
|
|
|
|
declare -A sshopts
|
|
sshopts=(
|
|
[StrictHostKeyChecking]="no"
|
|
[GlobalKnownHostsFile]="/dev/null"
|
|
[UserKnownHostsFile]="/dev/null"
|
|
[LogLevel]="ERROR"
|
|
)
|
|
|
|
# Config init
|
|
####
|
|
|
|
|
|
####
|
|
# Option Parsing
|
|
|
|
while getopts ":u:" opt; do
|
|
case $opt in
|
|
u)
|
|
conf[uname]="$OPTARG"
|
|
;;
|
|
\?)
|
|
echo "Unknown option -$OPTARG"
|
|
return 1
|
|
;;
|
|
:)
|
|
echo "Option requires argument: -$OPTARG"
|
|
return 1
|
|
;;
|
|
esac
|
|
done
|
|
|
|
# Remove parsed options from $@
|
|
shift $((OPTIND -1))
|
|
|
|
# Set the address based on the first
|
|
# arg if not already set in config array
|
|
if [[ ! -v conf[addr] ]]; then
|
|
conf[addr]="$1"
|
|
shift 1
|
|
fi
|
|
|
|
# Set the command as the rest of argv
|
|
# if not already set in config array
|
|
if [[ ! -v conf[cmd] ]]; then
|
|
conf[cmd]="$*"
|
|
fi
|
|
|
|
# Set ssh user name
|
|
sshopts[User]="${conf[uname]}"
|
|
|
|
# Set ssh host if not using sftp mode
|
|
case ${conf[method]} in
|
|
ssh)
|
|
:
|
|
;;
|
|
sftp)
|
|
unset "conf[cmd]"
|
|
;;
|
|
*)
|
|
echo "Unknown method: ${conf[method]}"
|
|
;;
|
|
esac
|
|
|
|
# Option Parsing
|
|
####
|
|
|
|
|
|
####
|
|
# Main
|
|
|
|
sshpass -p "${conf[pass]}" \
|
|
"${conf[method]}" \
|
|
$( # Format sshopts as a string that an ssh program understands
|
|
for opt in "${!sshopts[@]}"; do
|
|
printf '%s %s=%s ' "-o" "$opt" "${sshopts[$opt]}"
|
|
done
|
|
) \
|
|
"${conf[addr]}" \
|
|
"${conf[cmd]}"
|
|
|
|
# Main
|
|
####
|
|
}
|
|
|
|
|
|
cnsftp() {
|
|
# Initialize config array if it doesn't already exist
|
|
if [[ ! -v cnssh_conf[@] ]]; then
|
|
declare -A cnssh_conf
|
|
fi
|
|
|
|
# Set sftp mode instead of ssh
|
|
cnssh_conf[method]="sftp"
|
|
cnssh_conf[addr]="$*"
|
|
|
|
cnssh
|
|
|
|
unset "cnssh_conf[method]"
|
|
unset "cnssh_conf[addr]"
|
|
}
|