## 这个脚本的目的是打开或停止EC2,并且在打开的时候,把ssh和RDP的端口都制定本机的公网IP
#!/bin/bash
# 输入要操作的EC2实例ID
# instance_id="YOUR_INSTANCE_ID"
# 启动EC2实例
start_instance() {
aws ec2 start-instances --instance-ids "$instance_id" > null
echo "已启动EC2实例:$instance_id"
}
# 关闭EC2实例
stop_instance() {
aws ec2 stop-instances --instance-ids "$instance_id" --output text
echo "已关闭EC2实例:$instance_id"
}
# 修改安全组的SSH和RDP端口的地址
modify_SG() {
# 获取本地IP地址
local_ip=$(curl -s https://api.ipify.org)
# 获取特定EC2实例的安全组ID
security_groups=$(aws ec2 describe-instances --instance-ids "$instance_id" --query 'Reservations[*].Instances[*].SecurityGroups[*].GroupId' --output text)
# 打印安全组ID
echo "安全组ID:$security_groups"
# 修改所有EC2实例的SSH端口源
# aws ec2 describe-instances --query 'Reservations[*].Instances[*].[InstanceId]' --output text | while read -r instance_id; do
# aws ec2 authorize-security-group-ingress --group-id YOUR_SECURITY_GROUP_ID --protocol tcp --port 22 --cidr "$local_ip/32"
# done
# 修改所有EC2实例的SSH端口源
# aws ec2 describe-instances --query 'Reservations[*].Instances[*].[InstanceId]' --output text | while read -r instance_id; do
aws ec2 authorize-security-group-ingress --group-id $security_groups --protocol tcp --port 22 --cidr "$local_ip/32" > null
aws ec2 authorize-security-group-ingress --group-id $security_groups --protocol tcp --port 3389 --cidr "$local_ip/32" > null
# done
echo "安全组修改完成"
}
# 清除安全组的所有规则
clean_sg() {
security_group_id=$(aws ec2 describe-instances --instance-ids "$instance_id" --query 'Reservations[*].Instances[*].SecurityGroups[*].GroupId' --output text)
echo $security_group_id
echo '###############'
# 获取安全组中的所有规则
# rules=$(aws ec2 describe-security-group-rules --group-id $security_group_id --output text)
rules=$(aws ec2 describe-security-group-rules --filter 'Name="group-id",Values="'$security_group_id'"' --output text)
echo $rules
echo '--------------'
# 逐个删除规则
while read -r rule; do
rule_id=$(echo $rule | awk '{print $8}')
# aws ec2 revoke-security-group-ingress --group-id $security_group_id --rule-id $rule_id
aws ec2 revoke-security-group-ingress --group-id $security_group_id --security-group-rule-ids $rule_id >null
echo '==========='
echo $rule_id
done <<< "$rules"
echo "已成功删除安全组 $security_group_id 的所有规则。"
# 清除安全组的所有规则
# for security_group in $security_groups; do
# aws ec2 describe-security-groups --group-ids "$security_group" --query 'SecurityGroups[*].IpPermissions[*]' --output text | while read -r line; do
# echo $line
# echo '----------'
# aws ec2 revoke-security-group-ingress --group-id "$security_group" --protocol $line
# done
# echo "已清除安全组规则:$security_group"
# done
}
# 根据输入参数执行相应操作
if [[ "$1" == "start" ]]; then
start_instance
modify_SG
elif [[ "$1" == "stop" ]]; then
stop_instance
elif [[ "$1" == "clean" ]]; then
clean_sg
else
echo "无效的操作参数。请使用 'start' 或 'stop'或‘clean’。"
fi
因为安全原因,每次使用AWS EC2都要在安全组中指定公网IP,因为要移动办公,每次公网IP是不一样的,特此写了shell脚本自动化实现。
要运行这个脚本,你需要确保在你的Mac上已经安装了AWS CLI,并且已经配置了正确的AWS访问凭证(Access Key和Secret Access Key)。你可以使用 aws configure
命令来配置这些凭证。
在脚本中,将 YOUR_INSTANCE_ID
替换为要查询的特定EC2实例的实际ID。然后,使用 aws ec2 describe-instances
命令查询该实例的安全组ID,并将结果保存在 security_groups
变量中。最后,使用 echo
命令打印安全组ID。
在modify_SG函数中
在这个脚本中,我们使用 curl
命令从 https://api.ipify.org
获取本地IP地址,并将结果保存在 local_ip
变量中。并使用 aws ec2 authorize-security-group-ingress
命令将SSH端口的源IP更改为刚刚获取到的本地IP。
在clean_SG函数中
在脚本中,将 YOUR_INSTANCE_ID
替换为要清除规则的实际EC2实例的ID。首先,使用 aws ec2 describe-instances
命令获取该实例的安全组ID列表,并将结果保存在 security_groups
变量中。
然后,使用循环遍历每个安全组ID。在循环中,使用 aws ec2 describe-security-groups
命令获取每个安全组的规则,并使用 aws ec2 revoke-security-group-ingress
命令逐个清除规则。这里使用了 --protocol
参数,以便在清除规则时指定正确的协议。