【运维】SmartDNS 多台配置自动同步方案&企业微信通知

设置无密码登录

创建SSH密钥

ssh-keygen -t rsa -b 2048

复制SSH密钥到主机

ssh-copy-id root@主DNS的IP地址

设置更新脚本

/etc/smartdns/update\_config.sh

注意,有些文件没有的就修改:FILES变量即可

#!/bin/bash

# 远程机器的 IP 地址
REMOTE_IP="xxx.xxx.xxx.xxx"

# 配置文件列表
FILES=(
    "/etc/smartdns/smartdns.conf"
    "/etc/smartdns/gfwlist.conf"
    "/etc/smartdns/gfwlist.sh"
    "/etc/smartdns/local-list.conf"
    "/etc/smartdns/oversea-list.conf"
)

LOCAL_DIR="/etc/smartdns"               # 本地文件路径
BACKUP_DIR="/etc/smartdns/backup"       # 备份目录
WEBHOOK_URL="https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxxx"

# 创建备份目录(如果不存在的话)
mkdir -p "$BACKUP_DIR"

# 函数:发送企业微信报警推送
send_wechat_alert() {
    local title="$1"
    local message="$2"
    curl -X POST "$WEBHOOK_URL" -H 'Content-Type: application/json' -d '{
        "msgtype": "text",
        "text": {
            "content": "'"${title}"'\n'"${message}"'"
        }
    }'
}

# 循环处理每个文件
for REMOTE_FILE in "${FILES[@]}"; do
    # 获取文件名
    FILE_NAME=$(basename "$REMOTE_FILE")
    LOCAL_FILE="$LOCAL_DIR/$FILE_NAME"  # 本地文件路径

    # 使用 SCP 复制远程文件到临时文件
    TEMP_FILE=$(mktemp)
    scp root@$REMOTE_IP:$REMOTE_FILE "$TEMP_FILE"

    # 检查文件是否成功复制
    if [ $? -ne 0 ]; then
        echo "$FILE_NAME 配置文件复制失败!"
        send_wechat_alert "$FILE_NAME 更新失败" "从 $REMOTE_IP 更新 $REMOTE_FILE 失败,请检查!"
        continue
    fi

    # 判断本地文件和临时文件是否一致
    if diff -q "$LOCAL_FILE" "$TEMP_FILE" > /dev/null; then
        echo "$FILE_NAME 本地配置文件与远程文件一致,无需更新。"
        rm -f "$TEMP_FILE"  # 删除临时文件
    else
        echo "$FILE_NAME 本地配置文件与远程文件不一致,进行更新..."

        # 备份本地配置文件,使用时间戳作为后缀
        if [ -f "$LOCAL_FILE" ]; then
            TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
            cp "$LOCAL_FILE" "$BACKUP_DIR/${FILE_NAME}.$TIMESTAMP"
            echo "备份本地配置文件到 $BACKUP_DIR/${FILE_NAME}.$TIMESTAMP"
        fi

        # 更新本地配置文件
        mv "$TEMP_FILE" "$LOCAL_FILE"

        # 删除超过 7 天的备份
        find "$BACKUP_DIR" -name "${FILE_NAME}.*" -type f -mtime +7 -exec rm -f {} \;
        echo "已删除超过 7 天的备份文件"

        # 重启 smartdns 服务
        sudo systemctl restart smartdns
        echo "$FILE_NAME 配置文件已更新并重启 smartdns 服务。"

        # 发送成功通知
        send_wechat_alert "$FILE_NAME 更新成功" "$FILE_NAME 从 $REMOTE_IP 更新成功。"
    fi
done

修改脚本中的当前实例的IP地址

赋权

chmod +x update_config.sh

设置定时任务

crontab -e

然后添加以下行以每 10 分钟执行一次脚本:

*/10 * * * * /etc/smartdns/update_config.sh

标签: none

💬 2 条评论

  1. 文化差异分析可再深化以避免误读。

  2. 作者以简洁明了的语言,传达了深刻的思想和情感。

✍️ 发表评论