#!/bin/bash
# 确保脚本以错误退出方式运行
set -e
# 用户需要配置的变量
# 请输入您的目标实例 ID
INSTANCE_ID="i-080a5478b1443441d" # 替换为您的 EC2 实例 ID
# 获取当前关联的 Elastic IP 的 Allocation ID
CURRENT_EIP_ALLOC_ID=$(aws ec2 describe-addresses --filters "Name=instance-id,Values=$INSTANCE_ID" --query "Addresses[0].AllocationId" --output text)
if [ "$CURRENT_EIP_ALLOC_ID" != "None" ]; then
echo "当前实例 ($INSTANCE_ID) 关联的 Elastic IP Allocation ID: $CURRENT_EIP_ALLOC_ID"
echo "正在释放当前的 Elastic IP..."
aws ec2 release-address --allocation-id $CURRENT_EIP_ALLOC_ID
echo "当前的 Elastic IP 已释放。"
else
echo "实例 ($INSTANCE_ID) 没有关联的 Elastic IP。"
fi
# 分配新的 Elastic IP
echo "正在分配新的 Elastic IP..."
NEW_EIP_ALLOC_ID=$(aws ec2 allocate-address --domain vpc --query "AllocationId" --output text)
NEW_EIP_PUBLIC_IP=$(aws ec2 describe-addresses --allocation-ids $NEW_EIP_ALLOC_ID --query "Addresses[0].PublicIp" --output text)
echo "新的 Elastic IP Allocation ID: $NEW_EIP_ALLOC_ID"
echo "新的 Elastic IP Public IP: $NEW_EIP_PUBLIC_IP"
# 关联新的 Elastic IP 到实例
echo "正在将新的 Elastic IP 关联到实例 ($INSTANCE_ID)..."
aws ec2 associate-address --instance-id "$INSTANCE_ID" --allocation-id "$NEW_EIP_ALLOC_ID"
echo "新的 Elastic IP 已成功关联到实例 ($INSTANCE_ID)。"
echo "新的 Public IP: $NEW_EIP_PUBLIC_IP"
以下是更换运营商IP(Wavelength)
#!/bin/bash
# 确保脚本以错误退出方式运行
set -e
# 用户在脚本启动时输入
read -p "请输入 EC2 实例 ID(例如 i-xxxxxxxxxxxxxxxxx): " INSTANCE_ID
read -p "请输入 Network Border Group(例如 us-east-1-wl1-atl-wlz-1): " NETWORK_BORDER_GROUP
# 固定区域(如需要,也可以扩展为输入)
REGION="us-east-1"
# Carrier IP 记录文件
USED_IP_FILE="used_carrier_ips.txt"
# 确保记录文件存在
touch "$USED_IP_FILE"
# 定义函数来执行 EIP 更换操作
change_eip() {
echo "-----------------------------"
echo "开始更换 Carrier IP 于实例 ($INSTANCE_ID)"
echo "-----------------------------"
# 获取当前关联的 Elastic IP 的 Allocation ID 和 Association ID
CURRENT_EIP_ALLOC_ID=$(aws ec2 describe-addresses --filters "Name=instance-id,Values=$INSTANCE_ID" --query "Addresses[0].AllocationId" --output text --region "$REGION")
ASSOCIATION_ID=$(aws ec2 describe-addresses --filters "Name=instance-id,Values=$INSTANCE_ID" --query "Addresses[0].AssociationId" --output text --region "$REGION")
if [ "$CURRENT_EIP_ALLOC_ID" != "None" ]; then
echo "当前实例 ($INSTANCE_ID) 关联的 Elastic IP Allocation ID: $CURRENT_EIP_ALLOC_ID"
# 解除当前 Elastic IP 的关联
if [ "$ASSOCIATION_ID" != "None" ]; then
echo "正在解除当前的 Elastic IP 关联..."
aws ec2 disassociate-address --association-id "$ASSOCIATION_ID" --region "$REGION"
echo "当前的 Elastic IP 已解除关联。"
fi
# 释放当前的 Elastic IP
echo "正在释放当前的 Elastic IP..."
aws ec2 release-address --allocation-id "$CURRENT_EIP_ALLOC_ID" --network-border-group "$NETWORK_BORDER_GROUP" --region "$REGION"
echo "当前的 Elastic IP 已释放。"
else
echo "实例 ($INSTANCE_ID) 没有关联的 Elastic IP。"
fi
while true; do
# 分配新的 Elastic IP
echo "正在分配新的 Elastic IP..."
NEW_EIP_ALLOC_ID=$(aws ec2 allocate-address --domain vpc --network-border-group "$NETWORK_BORDER_GROUP" --query "AllocationId" --output text --region "$REGION")
# 查询 Carrier IP
NEW_CARRIER_IP=$(aws ec2 describe-addresses --allocation-ids "$NEW_EIP_ALLOC_ID" --query "Addresses[0].CarrierIp" --output text --region "$REGION")
echo "尝试分配 Carrier IP: $NEW_CARRIER_IP"
# 检查 Carrier IP 是否已经用过
if grep -Fxq "$NEW_CARRIER_IP" "$USED_IP_FILE"; then
echo "警告: Carrier IP ($NEW_CARRIER_IP) 已在记录中,释放并重新分配..."
# 释放分配到的 IP
aws ec2 release-address --allocation-id "$NEW_EIP_ALLOC_ID" --network-border-group "$NETWORK_BORDER_GROUP" --region "$REGION"
else
echo "Carrier IP ($NEW_CARRIER_IP) 是新的,继续使用。"
break
fi
done
# 关联新的 Elastic IP
echo "正在将新的 Elastic IP 关联到实例 ($INSTANCE_ID)..."
aws ec2 associate-address --instance-id "$INSTANCE_ID" --allocation-id "$NEW_EIP_ALLOC_ID" --region "$REGION"
echo "新的 Elastic IP 已成功关联到实例 ($INSTANCE_ID)。"
# 记录新的 Carrier IP 到文件
echo "$NEW_CARRIER_IP" >> "$USED_IP_FILE"
echo "新的 Carrier IP 已记录: $NEW_CARRIER_IP"
echo "-----------------------------"
}
# 主循环
while true; do
change_eip
# 提示用户按回车键以继续更换,或 Ctrl+C 退出
read -p "按回车键以继续更换 Carrier IP,或按 Ctrl+C 退出脚本..."
done
以下是另一种更换运营商IP(Wavelength)方式,通过不断关联并立即释放弹性运营商 IP。
#!/bin/bash
# ------------------------------
# 脚本:按回车分配并释放 EIP,直到实例拿到一个未用过的运营商 IP 并记录时间
# ------------------------------
set -e
# 1. 启动时输入实例 ID 和网络边界组
read -p "请输入 EC2 实例 ID(例如 i-04cdc286300c68ee8): " INSTANCE_ID
read -p "请输入 Network Border Group(例如 us-east-1-wl1-atl-wlz-1): " NETWORK_BORDER_GROUP
# 2. 固定区域
REGION="us-east-1"
# 3. 历史记录文件(时间 + IP),文件名 ip.txt
USED_IP_FILE="ip.txt"
touch "$USED_IP_FILE"
echo
echo "======================================"
echo "脚本已启动。每次按回车键尝试换一个未用过的运营商 IP。"
echo "要退出,请按 Ctrl+C"
echo "======================================"
echo
# 4. 主循环:每次回车触发一次“换 IP”流程
while true; do
read -p "按回车键开始换 IP…"
# 内层循环:直到拿到一个全新的 IP 才跳出
while true; do
# ---- A. 如果实例已有 EIP,先解除关联并释放 ----
CURRENT_ALLOC_ID=$(aws ec2 describe-addresses \
--filters "Name=instance-id,Values=$INSTANCE_ID" \
--query "Addresses[0].AllocationId" \
--output text --region "$REGION")
if [ "$CURRENT_ALLOC_ID" != "None" ]; then
echo "检测到已有 EIP:$CURRENT_ALLOC_ID,正在解除关联并释放…"
ASSOC_ID=$(aws ec2 describe-addresses \
--filters "Name=instance-id,Values=$INSTANCE_ID" \
--query "Addresses[0].AssociationId" \
--output text --region "$REGION")
aws ec2 disassociate-address --association-id "$ASSOC_ID" --region "$REGION"
aws ec2 release-address \
--allocation-id "$CURRENT_ALLOC_ID" \
--network-border-group "$NETWORK_BORDER_GROUP" \
--region "$REGION"
fi
# ---- B. 分配新的 EIP 并关联到实例 ----
echo "分配新的 EIP..."
NEW_ALLOC_ID=$(aws ec2 allocate-address \
--domain vpc \
--network-border-group "$NETWORK_BORDER_GROUP" \
--query "AllocationId" \
--output text \
--region "$REGION")
aws ec2 associate-address \
--instance-id "$INSTANCE_ID" \
--allocation-id "$NEW_ALLOC_ID" \
--region "$REGION" >/dev/null
# ---- C. 立即解除关联并释放这个 EIP ----
ASSOC_NEW=$(aws ec2 describe-addresses \
--allocation-ids "$NEW_ALLOC_ID" \
--query "Addresses[0].AssociationId" \
--output text --region "$REGION")
echo "解除关联并释放 EIP ($NEW_ALLOC_ID → AssocId: $ASSOC_NEW)…"
aws ec2 disassociate-address --association-id "$ASSOC_NEW" --region "$REGION"
aws ec2 release-address \
--allocation-id "$NEW_ALLOC_ID" \
--network-border-group "$NETWORK_BORDER_GROUP" \
--region "$REGION"
# ---- D. 从实例的 Public DNS 提取当前 IP ----
PUBLIC_DNS=$(aws ec2 describe-instances \
--instance-ids "$INSTANCE_ID" \
--query "Reservations[0].Instances[0].PublicDnsName" \
--output text --region "$REGION")
if [ -n "$PUBLIC_DNS" ] && [ "$PUBLIC_DNS" != "None" ]; then
DNS_HOST="${PUBLIC_DNS%%.*}" # ec2-155-146-100-87
IP_PART="${DNS_HOST#ec2-}" # 155-146-100-87
INSTANCE_IP="${IP_PART//-/\.}" # 155.146.100.87
else
# 如果 DNS 拿不到,就直接取 PublicIpAddress
INSTANCE_IP=$(aws ec2 describe-instances \
--instance-ids "$INSTANCE_ID" \
--query "Reservations[0].Instances[0].PublicIpAddress" \
--output text --region "$REGION")
fi
echo "当前实例运营商 IP → $INSTANCE_IP"
# ---- E. 去重检查:如果已记录,继续循环;否则记录并跳出 ----
if grep -Fq "$INSTANCE_IP" "$USED_IP_FILE"; then
echo ">> IP $INSTANCE_IP 已用过,重试一次…"
echo
continue
fi
# 记录时间戳和新 IP
TIMESTAMP=$(date "+%Y-%m-%dT%H:%M:%S%z")
echo "$TIMESTAMP $INSTANCE_IP" >> "$USED_IP_FILE"
echo "✅ 已记录:$TIMESTAMP $INSTANCE_IP"
echo
# 拿到全新 IP,结束内层循环
break
done
done