-
-
Save timkimber/12c297e0645920c413273c9d15edbc68 to your computer and use it in GitHub Desktop.
Start an EC2 Instance In Under 60 Seconds.
This file contains hidden or 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
| #!/bin/bash | |
| # Originally from jgamblin/instantkali.sh | |
| # https://gist.github.com/jgamblin/fff0bd2187f070390248c14cc9148062 | |
| set -e | |
| set -u | |
| now=$(date +"%m-%d-%y-%H%M") | |
| today=$(date +"%m-%d-%y") | |
| localip=$(curl -s https://ipinfo.io/ip) | |
| clear | |
| # TODO offer to use spot instance (after showing the price) | |
| read -r -p "Region (eu-west-2) [eu-west-2]: " ec2_region | |
| if [ -z "$ec2_region" ]; then ec2_region="eu-west-2"; fi | |
| echo "Checking for running instances with Tag=*Kali* in $ec2_region" | |
| IFS=$'\n\r' ec2_instances="$(aws ec2 describe-instances \ | |
| --filter "Name=tag-key,Values=Name" "Name=tag-value,Values=*Kali*" "Name=instance-state-name,Values=running" \ | |
| --query "Reservations[*].Instances[*].[KeyName,InstanceId,PublicIpAddress]" \ | |
| --region "${ec2_region}" \ | |
| --output text)" | |
| for instance_line in $ec2_instances | |
| do | |
| echo "$instance_line" | |
| IFS=$'\t' read -r -a running_instance<<<"$instance_line" | |
| printf "Found running instance: %s=%s\n" "${running_instance[0]}" "${running_instance[1]}" | |
| printf "Connect using:\n" | |
| printf " ssh -i ${HOME}/instant-ec2/KaliKey%s.pem ubuntu@%s\\n" "$today" "${running_instance[2]}" | |
| read -r -p "Terminate the running instance? [Y]: " terminate_instance | |
| if [ -z "$terminate_instance" ] || [ "$terminate_instance" = "Y" ]; then | |
| # Remove trailing carriage return | |
| if [ "${running_instance[1]: -1}" = $'\r' ]; then | |
| aws ec2 terminate-instances --region "$ec2_region" --instance-ids "${running_instance[1]::-1}" | |
| else | |
| aws ec2 terminate-instances --region "$ec2_region" --instance-ids "${running_instance[1]}" | |
| fi | |
| fi | |
| done | |
| read -r -p "Distribution (ubuntu) [ubuntu]: " ec2_distro | |
| if [ -z "$ec2_distro" ]; then ec2_distro="ubuntu"; fi | |
| read -r -p "Architecture (x86_64 / arm64) [arm64]: " ec2_arch | |
| if [ -z "$ec2_arch" ]; then ec2_arch="arm64"; fi | |
| IFS=$'\t' read -r -a ec2_out <<< "$(aws ec2 describe-images \ | |
| --owner amazon \ | |
| --filters "Name=name,Values='${ec2_distro}/images/*'" "Name=architecture,Values=${ec2_arch}" \ | |
| --query "sort_by(Images, &CreationDate)[-1].[ImageId,Description]" \ | |
| --region "${ec2_region}" --output text)" | |
| if [ "${ec2_arch}" == "arm64" ]; then | |
| instance_type="t4g.small" | |
| instance_cost="\$0.0188 per hour" | |
| else | |
| instance_type="t3.small" | |
| instance_cost="\$0.0236 per hour" | |
| fi | |
| printf "\\nAMI: %s\\n" "${ec2_out[0]}" | |
| printf "Description: %s\\n" "${ec2_out[1]}" | |
| printf "Type: %s\\n" "${instance_type} (${instance_cost})" | |
| printf "\\n" | |
| read -r -p "Start instance? [N]: " start | |
| if [ "$start" != "Y" ]; then exit; fi | |
| mkdir -p "${HOME}/instant-ec2/" | |
| # Check to see if we've already created a key for today | |
| if [ ! -e "${HOME}/instant-ec2/KaliKey${today}.pem" ]; then | |
| # Create SSH Key | |
| aws ec2 create-key-pair --key-name "KaliKey${today}" --query 'KeyMaterial' --region "$ec2_region" --output text > "${HOME}/instant-ec2/KaliKey${today}.pem" | |
| chmod 400 "${HOME}/instant-ec2/KaliKey${today}.pem" | |
| # Create Security Group | |
| aws ec2 create-security-group --group-name KaliSecurityGroupSSHOnly"$today" --region "$ec2_region" --description "Inbound SSH only from my IP address" > /dev/null | |
| aws ec2 authorize-security-group-ingress --group-name KaliSecurityGroupSSHOnly"$today" --region "$ec2_region" --cidr "$localip"/32 --protocol tcp --port 22 | |
| fi | |
| # Launch a Ec2 instance | |
| run_instances_output=$(aws ec2 run-instances \ | |
| --image-id "${ec2_out[0]}" \ | |
| --instance-type ${instance_type} \ | |
| --key-name "KaliKey$today" \ | |
| --region "$ec2_region" \ | |
| --security-groups "KaliSecurityGroupSSHOnly$today" \ | |
| --tag-specifications "ResourceType=instance,Tags=[{Key=Name,Value=Kali${now}}]" \ | |
| --query "Instances[*].[InstanceId,State.Name]" \ | |
| --output text) | |
| IFS=$'\t' read -r -a instance<<<"$run_instances_output" | |
| id=${instance[0]} | |
| state=${instance[1]} | |
| printf "Instance launched: %s state: %s \\n" "$id" "$state" | |
| printf "\\n" | |
| printf "Starting Instance: \\n" | |
| # Wait for instance in `running` status | |
| while [ "$state" = pending ]; do | |
| echo -ne "Waiting for running status.\\r" | |
| sleep 10 | |
| state=$(aws ec2 describe-instances --instance-ids "$id" --query "Reservations[*].Instances[*].State.Name" --region "$ec2_region" --output text) | |
| done | |
| printf "\\n" | |
| # Fetch the publish host name | |
| awsip=$(aws ec2 describe-instances --instance-ids "$id" --query "Reservations[*].Instances[*].PublicIpAddress" --region "$ec2_region" --output=text) | |
| # Probe SSH connection until it's available | |
| X_READY='' | |
| while [ ! "$X_READY" ]; do | |
| echo -ne "Waiting for ready status.\\r" | |
| sleep 10 | |
| set +e | |
| if (ssh -o ConnectTimeout=1 -o StrictHostKeyChecking=no -o BatchMode=yes "ubuntu@${awsip}" 2>&1 | grep 'Permission denied' ) | |
| then | |
| X_READY='ready' | |
| fi | |
| set -e | |
| done | |
| printf "\\n" | |
| printf "\\n" | |
| # Done | |
| printf "Kali is Ready! Login With:\\n" | |
| printf "ssh -i ${HOME}/instant-ec2/KaliKey%s.pem ubuntu@%s\\n" "$today" "$awsip" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment