!/bin/bash
服务器信息列表
SERVERS=(
“user1@vps1_ipv6”
“user2@vps2_ipv6”
“user3@vps3_ipv6”
)
你的网络接口
INTERFACE=”eth0″
固定的 IPv6 前三组列表
PREFIX_LIST=(“2001:db8:2” “2001:db8:d” “2001:db8:5”)
生成随机的 IPv6 地址后 5 组
generate_ipv6_suffix() {
echo “$(printf “%x:%x:%x:%x:%x” $((RANDOM%65536)) $((RANDOM%65536)) \
$((RANDOM%65536)) $((RANDOM%65536)) $((RANDOM%65536)))”
}
备份文件
TIMESTAMP=$(date +”%Y%m%d_%H%M%S”)
BACKUP_FILE=”ipv6_backup_${TIMESTAMP}.txt”
LOGFILE=”ipv6_update.log”
ERROR_SERVERS=() # 记录失败的服务器
echo “===== $(date) 开始更新 IPv6 地址 =====” | tee -a $LOGFILE
echo “===== $(date) 备份文件: ${BACKUP_FILE} =====” | tee -a $LOGFILE
遍历每台服务器
for SERVER in “${SERVERS[@]}”; do
# 选择随机 IPv6 前缀
PREFIX=”${PREFIX_LIST[$RANDOM % ${#PREFIX_LIST[@]}]}”
# 生成完整的 IPv6 地址
NEW_IPV6="${PREFIX}:$(generate_ipv6_suffix)"
echo "正在更新 ${SERVER} 的 IPv6 地址为: ${NEW_IPV6}" | tee -a $LOGFILE
# 检查 SSH 连接是否成功
if ! ssh -o ConnectTimeout=10 -o StrictHostKeyChecking=no ${SERVER} "exit"; then
echo "无法连接到 ${SERVER},跳过..." | tee -a $LOGFILE
ERROR_SERVERS+=("${SERVER}")
continue
fi
# 获取旧的 IPv6 地址
OLD_IPV6=$(ssh -o StrictHostKeyChecking=no ${SERVER} "ip -6 addr show ${INTERFACE} | grep 'inet6 ' | awk '{print \$2}' | head -n 1" 2>/dev/null)
echo "旧 IPv6: ${OLD_IPV6} -> 新 IPv6: ${NEW_IPV6}" | tee -a $BACKUP_FILE
# 远程更新 IPv6 地址
ssh -o StrictHostKeyChecking=no ${SERVER} << EOF | tee -a $LOGFILE
BACKUP_DIR="/root/ipv6_backup/${TIMESTAMP}"
sudo mkdir -p "\$BACKUP_DIR"
sudo cp /etc/network/interfaces "\$BACKUP_DIR/interfaces.bak" 2>/dev/null
sudo cp /etc/netplan/*.yaml "\$BACKUP_DIR/" 2>/dev/null
sudo cp /etc/systemd/network/*.network "\$BACKUP_DIR/" 2>/dev/null
sudo tar -czf "/root/ipv6_backup/backup_${TIMESTAMP}.tar.gz" -C "\$BACKUP_DIR" . && sudo rm -rf "\$BACKUP_DIR"
if [ -f /etc/network/interfaces ]; then
sudo sed -i '/iface ${INTERFACE} inet6 static/{n;s/address .*/address ${NEW_IPV6}/}' /etc/network/interfaces || exit 1
sudo systemctl restart networking || exit 1
elif ls /etc/netplan/*.yaml >/dev/null 2>&1; then
sudo sed -i 's/\(addresses:\)\s*\[.*\]/\1 [${NEW_IPV6}]/' /etc/netplan/*.yaml || exit 1
sudo netplan apply || exit 1
elif systemctl is-active systemd-networkd >/dev/null 2>&1; then
sudo sed -i 's/\(Address=\).*/\1${NEW_IPV6}\/64/' /etc/systemd/network/*.network || exit 1
sudo systemctl restart systemd-networkd || exit 1
elif nmcli -t -f RUNNING general 2>/dev/null | grep -q "running"; then
sudo nmcli connection modify ${INTERFACE} ipv6.addresses ${NEW_IPV6}/64 || exit 1
sudo nmcli connection up ${INTERFACE} || exit 1
else
exit 1
fi
EOF
if [ $? -ne 0 ]; then
echo "更新 ${SERVER} 的 IPv6 地址失败" | tee -a $LOGFILE
ERROR_SERVERS+=("${SERVER}")
fi
done
if [ ${#ERROR_SERVERS[@]} -ne 0 ]; then
echo “===== 以下服务器更新失败 =====” | tee -a $LOGFILE
printf ‘%s\n’ “${ERROR_SERVERS[@]}” | tee -a $LOGFILE
fi
echo “===== $(date) 所有服务器 IPv6 更新完成! =====” | tee -a $LOGFILE