ImmortalWrt:每天自动更新geoip.dat以及geosite.dat脚本

  • 享乐分享享乐分享
  • 1天前
  • 16
  • 阅读6分钟
  • ImmortalWrt:每天自动更新geoip.dat以及geosite.dat脚本-享乐分享

    最近这段时间正在使用dead这个Luci,如果你也在使用,这个脚本你可能也会用到,因为daed默认不会自动下载最新版本的geoip.dat以及geosite.dat文件,于是我就问了问Claude,下面是相关的操作步骤。

    脚本内容

    #!/bin/sh
    # update_geodat.sh
    # 自动更新 v2ray geoip.dat 和 geosite.dat
    # 数据源: https://github.com/Loyalsoldier/v2ray-rules-dat
    
    DAT_DIR="/usr/share/v2ray"
    BACKUP_DIR="${DAT_DIR}/backup"
    LOG_FILE="/var/log/update_geodat.log"
    BASE_URL="https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download"
    DATE_TAG=$(date '+%Y%m%d_%H%M%S')
    MAX_BACKUPS=3
    
    FILES="geoip.dat geosite.dat"
    
    log() {
        echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE"
    }
    
    log "========== 开始更新 =========="
    
    # 确保备份目录存在
    mkdir -p "$BACKUP_DIR"
    
    # 1. 备份当前文件
    for f in $FILES; do
        if [ -f "${DAT_DIR}/${f}" ]; then
            cp -f "${DAT_DIR}/${f}" "${BACKUP_DIR}/${f}.${DATE_TAG}"
            log "已备份 ${f} -> ${f}.${DATE_TAG}"
        fi
    done
    
    # 2. 下载新文件到临时位置,校验后再替换
    DOWNLOAD_OK=1
    for f in $FILES; do
        TMP_FILE="/tmp/${f}.tmp"
        log "正在下载 ${f} ..."
        wget -q --no-check-certificate -O "$TMP_FILE" "${BASE_URL}/${f}"
        
        if [ $? -ne 0 ] || [ ! -s "$TMP_FILE" ]; then
            log "错误: ${f} 下载失败"
            rm -f "$TMP_FILE"
            DOWNLOAD_OK=0
        else
            SIZE=$(wc -c < "$TMP_FILE" | tr -d ' ')
            log "${f} 下载完成,大小: ${SIZE} 字节"
        fi
    done
    
    # 3. 只有全部下载成功才替换
    if [ "$DOWNLOAD_OK" -eq 1 ]; then
        for f in $FILES; do
            TMP_FILE="/tmp/${f}.tmp"
            mv -f "$TMP_FILE" "${DAT_DIR}/${f}"
            log "${f} 已更新"
        done
        log "全部更新成功,正在重启 daed ..."
        /etc/init.d/daed restart 2>/dev/null && log "daed 已重启" || log "daed 重启失败(请确认服务名称)"
    else
        log "部分文件下载失败,已回滚,本次不更新"
        # 清理可能残留的临时文件
        for f in $FILES; do
            rm -f "/tmp/${f}.tmp"
        done
    fi
    
    # 4. 清理旧备份,只保留最近 MAX_BACKUPS 份
    for f in $FILES; do
        ls -1t "${BACKUP_DIR}/${f}."* 2>/dev/null | tAIl -n +$((MAX_BACKUPS + 1)) | xargs rm -f 2>/dev/null
    done
    
    log "========== 更新结束 =========="
    

    上传脚本并赋权

    # 把脚本放到路由器上(可通过 SCP 或直接粘贴内容)
    chmod +x /usr/bin/update_geodat.sh
    

    添加定时任务(每天凌晨 2:00 执行)

    # 写入 crontab
    echo "0 2 * * * /usr/bin/update_geodat.sh" >> /etc/crontabs/root
    # 重启 cron 服务使其生效
    /etc/init.d/cron restart
    

    或者通过LuCI界面操作:进入「系统」→「计划任务」,在末尾添加一行「0 2 * * * /usr/bin/update_geodat.sh」,然后保存。

    逻辑说明

    脚本的核心逻辑是:先备份现有文件→下载到临时目录→两个文件都成功才替换并重启daed→任何一个失败则不替换、保留原文件。

    备份默认保留最近3份,可在脚本顶部的MAX_BACKUPS变量中调整。如果daed的服务名不是daed,也请在脚本中修改/etc/init.d/daed restart这行。

    推荐文章

  • 0
  • 0
  • ImmortalWrt:每天自动更新geoip.dat以及geosite.dat脚本
  • 发表评论

    发表

    引用链接

    大家在看

  • 站点
  • 软件
  • 技巧
  • 上升前十

  • 站点
  • 软件
  • 技巧
  • 订阅我们

    输入你的电子邮件地址订阅网站,我们会在有必要时通过邮件联系您
    订阅
    *订阅成功后会收到订阅通知
    微信公众号:xiangleshare
    三天内不显示