Skip to content

Instantly share code, notes, and snippets.

@mencarellic
Created April 3, 2022 03:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mencarellic/b564e13c77c3592614a3a64b659452aa to your computer and use it in GitHub Desktop.
Save mencarellic/b564e13c77c3592614a3a64b659452aa to your computer and use it in GitHub Desktop.
#!/usr/bin/env bash
# Found at https://unix.stackexchange.com/a/415155
function select_option {
# little helpers for terminal print control and key input
ESC=$( printf "\033")
cursor_blink_on() { printf "$ESC[?25h"; }
cursor_blink_off() { printf "$ESC[?25l"; }
cursor_to() { printf "$ESC[$1;${2:-1}H"; }
print_option() { printf " $1 "; }
print_selected() { printf " $ESC[7m $1 $ESC[27m"; }
get_cursor_row() { IFS=';' read -sdR -p $'\E[6n' ROW COL; echo ${ROW#*[}; }
key_input() { read -s -n3 key 2>/dev/null >&2
if [[ $key = $ESC[A ]]; then echo up; fi
if [[ $key = $ESC[B ]]; then echo down; fi
if [[ $key = "" ]]; then echo enter; fi; }
# initially print empty new lines (scroll down if at bottom of screen)
for opt; do printf "\n"; done
# determine current screen position for overwriting the options
local lastrow=`get_cursor_row`
local startrow=$(($lastrow - $#))
# ensure cursor and input echoing back on upon a ctrl+c during read -s
trap "cursor_blink_on; stty echo; printf '\n'; exit" 2
cursor_blink_off
local selected=0
while true; do
# print options by overwriting the last lines
local idx=0
for opt; do
cursor_to $(($startrow + $idx))
if [ $idx -eq $selected ]; then
print_selected "$opt"
else
print_option "$opt"
fi
((idx++))
done
# user key control
case `key_input` in
enter) break;;
up) ((selected--));
if [ $selected -lt 0 ]; then selected=$(($# - 1)); fi;;
down) ((selected++));
if [ $selected -ge $# ]; then selected=0; fi;;
esac
done
# cursor position back to normal
cursor_to $lastrow
printf "\n"
cursor_blink_on
return $selected
}
function preflight {
if [ -z "$AWS_PROFILE" ]; then
if [ $? -ne 0 ]; then
echo "AWS_PROFILE must be set"
return 1
fi
fi
if [ -z "$AWS_REGION" ]; then
region=`aws configure get region --profile $AWS_PROFILE`
if [ $? -ne 0 ]; then
return 1
fi
fi
}
function get_instance_id {
AWS_PAGER="" AWS_CLI_AUTO_PROMPT=off aws ec2 describe-instances --no-paginate --filters 'Name=instance-state-name,Values=running' "Name=tag:Name,Values=$1" --query 'Reservations[].Instances[].[InstanceId]' --output text
}
preflight
if [ -z "$1" ]; then
echo "Must supply an instance id or instance name"
return 1
fi
if [[ $1 =~ ^i-[A-z0-9]{8,17} ]]; then
instanceId=$1
else
IFS=$'\n' arr=($(get_instance_id $1))
if [ ${#arr[@]} -eq 0 ]; then
echo "Error. Could not find instance with name $1. Exiting..."
exit 1
elif [ ${#arr[@]} -eq 1 ]; then
instanceId=${arr[0]}
else
echo "Found multiple instances. Connect to which one?"
select_option "${arr[@]}"
choice=$?
instanceId=${arr[$choice]}
fi
fi
AWS_CLI_AUTO_PROMPT=off aws ssm start-session --target $instanceId
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment