-
-
Save mencarellic/b564e13c77c3592614a3a64b659452aa to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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