cnssh: Refactored to support authentication on remote devices
This commit is contained in:
		
							parent
							
								
									1a2a0e83f9
								
							
						
					
					
						commit
						c2ddb0184a
					
				@ -1,16 +1,103 @@
 | 
				
			|||||||
cnssh() {
 | 
					cnssh() {	# Helper for sshing into Crestron devices
 | 
				
			||||||
	# Usage: cnssh <ip address> [command]
 | 
							# 
 | 
				
			||||||
	local uname="Crestron"
 | 
							# USAGE
 | 
				
			||||||
	local pass=""
 | 
							#
 | 
				
			||||||
	local addr="$1"
 | 
							#	cnssh <ip address> [command]
 | 
				
			||||||
	shift
 | 
							#
 | 
				
			||||||
	local cmd="$@" 
 | 
							#
 | 
				
			||||||
 | 
							# 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	|
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sshpass -p "$pass" ssh \
 | 
					
 | 
				
			||||||
 | 
						####
 | 
				
			||||||
 | 
						# Config init
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Initialize config array if it doesn't already exist
 | 
				
			||||||
 | 
						if [[ ! -v cnssh_conf[@] ]]; then
 | 
				
			||||||
 | 
							declare -A cnssh_conf
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Initialize and populate default config array
 | 
				
			||||||
 | 
						declare -A dconf
 | 
				
			||||||
 | 
						dconf=(
 | 
				
			||||||
 | 
							[uname]="Crestron"
 | 
				
			||||||
 | 
							[pass]=""
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Config init
 | 
				
			||||||
 | 
						####
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						####
 | 
				
			||||||
 | 
						# Option Parsing
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						while getopts ":u:" opt; do
 | 
				
			||||||
 | 
							case $opt in
 | 
				
			||||||
 | 
								u)
 | 
				
			||||||
 | 
									cnssh_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 cnssh_conf[addr] ]]; then
 | 
				
			||||||
 | 
							cnssh_conf[addr]="$1"
 | 
				
			||||||
 | 
							shift 1
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Set the command as the rest of argv
 | 
				
			||||||
 | 
						#  if not already set in config array
 | 
				
			||||||
 | 
						if [[ ! -v cnssh_conf[cmd] ]]; then
 | 
				
			||||||
 | 
							cnssh_conf[cmd]="$*"
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Apply defaults to running config
 | 
				
			||||||
 | 
						for opt in "${!dconf[@]}"; do
 | 
				
			||||||
 | 
							# Don't apply the default if it's already set
 | 
				
			||||||
 | 
							if [[ ! -v cnssh_conf[$opt] ]]; then
 | 
				
			||||||
 | 
								cnssh_conf[$opt]=${dconf[$opt]}
 | 
				
			||||||
 | 
							fi
 | 
				
			||||||
 | 
						done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Option Parsing
 | 
				
			||||||
 | 
						####
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						####
 | 
				
			||||||
 | 
						# Main
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						sshpass -p "${cnssh_conf[pass]}" ssh \
 | 
				
			||||||
		-o StrictHostKeyChecking=no\
 | 
							-o StrictHostKeyChecking=no\
 | 
				
			||||||
		-o GlobalKnownHostsFile=/dev/null\
 | 
							-o GlobalKnownHostsFile=/dev/null\
 | 
				
			||||||
		-o UserKnownHostsFile=/dev/null\
 | 
							-o UserKnownHostsFile=/dev/null\
 | 
				
			||||||
		-o LogLevel=ERROR\
 | 
							-o LogLevel=ERROR\
 | 
				
			||||||
		-o User="$uname"\
 | 
							-o User="${cnssh_conf[uname]}"\
 | 
				
			||||||
		"$addr" "$cmd"
 | 
							"${cnssh_conf[addr]}" "${cnssh_conf[cmd]}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Main
 | 
				
			||||||
 | 
						####
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user