
最近这段时间正在使用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这行。

