From 43c7d79e09e73239024c19c0e5046fb3ca03dc5b Mon Sep 17 00:00:00 2001 From: sushen339 Date: Tue, 18 Nov 2025 04:17:40 +0800 Subject: [PATCH] --- block-ip.sh | 53 ++++++++++++++++++++++++++++------------------------- 1 file changed, 28 insertions(+), 25 deletions(-) diff --git a/block-ip.sh b/block-ip.sh index b54cf25..30cff1a 100644 --- a/block-ip.sh +++ b/block-ip.sh @@ -143,33 +143,9 @@ ban_ip() { # 查询新IP的国家信息 COUNTRY_CODE=$(curl -s --max-time 2 "https://ipinfo.io/$BASE_IP/country" 2>/dev/null | tr -d '\n\r ') [ -n "$COUNTRY_CODE" ] && [ ${#COUNTRY_CODE} -ne 2 ] && COUNTRY_CODE="" - - # 趁API可用时,为文件中没有国家信息的旧IP补充查询(最多补充3个,避免耗时过长) - if [ -f "$PERSIST_FILE" ] && [ -s "$PERSIST_FILE" ]; then - UPDATE_COUNT=0 - TEMP_UPDATE="/tmp/block_ip_update_$$" - cp "$PERSIST_FILE" "$TEMP_UPDATE" - - while IFS= read -r line; do - [ "$UPDATE_COUNT" -ge 3 ] && break - # 只处理不含'|'的IPv4单IP行 - if ! echo "$line" | grep -q '|' && ! echo "$line" | grep -q ':' && ! echo "$line" | grep -q '/'; then - OLD_IP="$line" - OLD_COUNTRY=$(curl -s --max-time 2 "https://ipinfo.io/$OLD_IP/country" 2>/dev/null | tr -d '\n\r ') - if [ -n "$OLD_COUNTRY" ] && [ ${#OLD_COUNTRY} -eq 2 ]; then - # 在临时文件中替换该行 - sed -i "s|^$OLD_IP$|$OLD_IP|$OLD_COUNTRY|" "$TEMP_UPDATE" - UPDATE_COUNT=$((UPDATE_COUNT + 1)) - log "[补充地区] IP=$OLD_IP 国家=$(get_country_name "$OLD_COUNTRY")" - fi - fi - done < "$PERSIST_FILE" - - # 如果有更新则覆盖原文件 - [ "$UPDATE_COUNT" -gt 0 ] && mv "$TEMP_UPDATE" "$PERSIST_FILE" || rm -f "$TEMP_UPDATE" - fi fi + # 先保存新IP到文件 if [ "$SAVE_DISK" -eq 1 ]; then # 检查是否已存在(支持带国家代码的格式) if ! grep -qE "^$TARGET_IP(\||$)" "$PERSIST_FILE" 2>/dev/null; then @@ -182,6 +158,33 @@ ban_ip() { log "[执行封禁] IP=$TARGET_IP 已封禁" fi fi + + # 新IP保存后,趁API可用时为文件中没有国家信息的旧IP补充查询(最多补充3个) + if [ "$SHOULD_QUERY" -eq 1 ] && command -v curl >/dev/null 2>&1; then + if [ -f "$PERSIST_FILE" ] && [ -s "$PERSIST_FILE" ]; then + UPDATE_COUNT=0 + TEMP_UPDATE="/tmp/block_ip_update_$$" + cp "$PERSIST_FILE" "$TEMP_UPDATE" + + while IFS= read -r line; do + [ "$UPDATE_COUNT" -ge 3 ] && break + # 只处理不含'|'的IPv4单IP行,且不是刚添加的IP + if [ "$line" != "$TARGET_IP" ] && ! echo "$line" | grep -q '|' && ! echo "$line" | grep -q ':' && ! echo "$line" | grep -q '/'; then + OLD_IP="$line" + OLD_COUNTRY=$(curl -s --max-time 2 "https://ipinfo.io/$OLD_IP/country" 2>/dev/null | tr -d '\n\r ') + if [ -n "$OLD_COUNTRY" ] && [ ${#OLD_COUNTRY} -eq 2 ]; then + # 在临时文件中替换该行 + sed -i "s|^$OLD_IP$|$OLD_IP|$OLD_COUNTRY|" "$TEMP_UPDATE" + UPDATE_COUNT=$((UPDATE_COUNT + 1)) + log "[补充地区] IP=$OLD_IP 国家=$(get_country_name "$OLD_COUNTRY")" + fi + fi + done < "$PERSIST_FILE" + + # 如果有更新则覆盖原文件 + [ "$UPDATE_COUNT" -gt 0 ] && mv "$TEMP_UPDATE" "$PERSIST_FILE" || rm -f "$TEMP_UPDATE" + fi + fi elif [ "$SAVE_DISK" -ne 2 ]; then log "[执行封禁] IP=$TARGET_IP 已封禁" fi