cnssh() { # Helper for sshing into Crestron devices # # USAGE # # cnssh [command] # # # OPTIONS # # -u Specify the username to use with ssh # Default: "Crestron" # # CONFIG ARRAY: cnssh_conf # # # | Option | Valid Args | Default | Description | # | ------------- | ------------- | ------------- | --------------------------------------------- | # | uname | | "Crestron" | The username for use with ssh | # | pass | | "" | The password for use with ssh (via sshpass) | # | addr | | | The address of the remote device | # | cmd | | [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]" }