设置无密码登录
创建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
文化差异分析可再深化以避免误读。
作者以简洁明了的语言,传达了深刻的思想和情感。