Skip to content

Instantly share code, notes, and snippets.

@quintindk
Created November 8, 2022 19:35
Show Gist options
  • Save quintindk/0a890ef022f6436c165648dec08ea6ce to your computer and use it in GitHub Desktop.
Save quintindk/0a890ef022f6436c165648dec08ea6ce to your computer and use it in GitHub Desktop.
Quick script to connect to a VM using bastion from your terminal. This uses tunnels rather than az network bastion ssh because I didn't know to install the ssh add-on in az cli.
#! /bin/bash
subscription=$1
if [[ -n $2 ]]; then
vm_name=$2
fi
if [[ -n $3 ]]; then
vm_username=$3
fi
if [[ -n $4 ]]; then
vm_keyname=$4
fi
if [[ -n $5 ]]; then
kv_name=$5
fi
bastion=$(az network bastion list --subscription "$subscription")
bastion_name=$(echo "$bastion" | jq -r '.[] | [.name] | @csv' | tr -d '"')
bastion_rg=$(echo "$bastion" | jq -r '.[] | [.resourceGroup] | @csv' | tr -d '"')
localport=$(( "$RANDOM" % 65535 + 4000 ))
if [[ -z $vm_name ]]; then
PS3="Select the virtual machine: "
select name in $(az vm list --subscription "$subscription" | jq -r '.[] | [ .name ] | @csv ' | tr -d '"')
do
read -rp "User name: " username
read -rp "User SSH key in KeyVault? (y/N) " sshkey
if [[ $sshkey == y ]] || [[ $sshkey == Y ]]; then
read -rp "Key name: " keyname
tempkey=$(mktemp)
az keyvault secret show --name "$keyname" --vault-name "$kv_name" --query value -o tsv --subscription "$subscription" > "$tempkey"
command="ssh -i $tempkey -p $localport -o ConnectTimeout=10 -o StrictHostKeyChecking=no $username@127.0.0.1"
else
command="ssh -p $localport -o ConnectTimeout=10 -o StrictHostKeyChecking=no $username@127.0.0.1"
fi
break 1;
done
else
name=$vm_name
if [[ -n $vm_keyname ]]; then
tempkey=$(mktemp)
az keyvault secret show --name "$vm_keyname" --vault-name "$kv_name" --query value -o tsv --subscription "$subscription" > "$tempkey"
command="ssh -i $tempkey -p $localport -o ConnectTimeout=10 -o StrictHostKeyChecking=no $vm_username@127.0.0.1"
else
command="ssh -p $localport -o ConnectTimeout=10 -o StrictHostKeyChecking=no $vm_username@127.0.0.1"
fi
fi
id=$(az vm list --subscription "$subscription" | jq -r ".[] | select (.name == \"$name\") | [ .id ] | @tsv")
#echo "az network bastion tunnel --name $bastion_name --resource-group $bastion_rg --target-resource-id $id --resource-port 22 --port $localport --subscription $subscription"
screen -dmSL connect-$localport -L az network bastion tunnel --name "$bastion_name" --resource-group "$bastion_rg" --target-resource-id "$id" --resource-port 22 --port $localport --subscription $subscription
#az network bastion tunnel --name "$bastion_name" --resource-group "$bastion_rg" --target-resource-id "$id" --resource-port 22 --port $localport --subscription $subscription
sleep 5
echo "Port $localport listening..."
eval "$command"
kill -15 "$(screen -ls | grep "[0-9]*\.connect-$localport*" | sed -E 's/\s+([0-9]+)\..*/\1/')"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment