本脚本用于自动检测本机公网IP并更新阿里云DNS记录,支持多域名多主机记录批量更新。
- 自动检测本机公网IP
- 支持配置文件和命令行参数两种方式指定域名和主机记录
- 阿里云CLI工具自动检测和安装
- 阿里云凭证配置引导
- DNS记录自动更新
- 详细的日志记录功能
/opt/audodns/
├── autodns.sh # 主脚本文件
├── autodns.conf.example # 配置文件示例
└── README.md # 本说明文档
首次运行脚本时,会自动检查阿里云CLI工具并提示配置凭证:
aliyun configure set \
--profile AkProfile \
--mode AK \
--access-key-id <yourAccessKeyID> \
--access-key-secret <yourAccessKeySecret> \
--region "cn-hangzhou"配置完成后,凭证文件会保存在 /root/.aliyun/config.json。
有两种方式可以配置域名和主机记录:
复制配置文件示例并编辑:
cp /opt/audodns/autodns.conf.example /etc/autodns.conf
vi /etc/autodns.conf在配置文件中添加域名和主机记录:
# 配置单个域名
DOMAIN="example.com"
# 配置域名和主机记录
HOST_RECORDS="example.com:www,mail"直接在命令行中指定域名和主机记录:
# 指定单个域名
/opt/audodns/autodns.sh -d example.com
# 指定多个域名
/opt/audodns/autodns.sh -d example.com -d test.org
# 指定域名和主机记录
/opt/audodns/autodns.sh -r example.com:www,mail创建一个Systemd服务文件来管理脚本运行:
vi /etc/systemd/system/autodns.service添加以下内容:
[Unit]
Description=阿里云DNS自动更新服务
After=network.target
[Service]
Type=oneshot
ExecStart=/bin/bash /opt/audodns/autodns.sh
# 如果需要指定配置参数,可以这样写
# ExecStart=/bin/bash /opt/audodns/autodns.sh -r example.com:www,mail
WorkingDirectory=/opt/audodns
User=root
[Install]
WantedBy=multi-user.target为了定期执行脚本,创建一个Systemd定时器文件:
vi /etc/systemd/system/autodns.timer添加以下内容(每30分钟执行一次):
[Unit]
Description=定期执行阿里云DNS自动更新脚本
[Timer]
# 每30分钟执行一次
OnCalendar=*:0/30
Persistent=true
[Install]
WantedBy=timers.target# 启用并启动定时器
systemctl daemon-reload
systemctl enable autodns.timer
systemctl start autodns.timer
# 查看定时器状态
systemctl list-timers autodns.timer
# 手动触发一次执行
systemctl start autodns.service-
调整检查间隔:
- 不要过于频繁地执行脚本,建议30分钟或更长时间执行一次
- 修改
autodns.timer文件中的OnCalendar参数来调整执行频率
-
添加IP变化检测:
- 在脚本中添加逻辑,只在公网IP发生变化时才调用阿里云API
- 下面是一个简单的IP变化检测函数示例,可以添加到脚本中:
# 检查IP是否变化 check_ip_changed() { local current_ip="$1" local ip_cache_file="/opt/audodns/last_ip.txt" # 如果缓存文件不存在,认为IP发生了变化 if [ ! -f "$ip_cache_file" ]; then echo "$current_ip" > "$ip_cache_file" return 0 fi # 读取上次的IP local last_ip="$(cat "$ip_cache_file")" # 比较IP是否发生变化 if [ "$current_ip" != "$last_ip" ]; then echo "$current_ip" > "$ip_cache_file" return 0 fi # IP没有变化 return 1 }
然后在main函数中添加调用:
# 获取当前公网IP local public_ip=$(get_public_ip) if [ -z "$public_ip" ]; then log "ERROR" "无法获取公网IP,退出程序" exit 1 fi # 检查IP是否变化,没有变化则退出 if ! check_ip_changed "$public_ip"; then log "INFO" "公网IP未发生变化,无需更新DNS记录" exit 0 fi
-
增加重试机制:
- 脚本已经包含重试机制,避免因临时网络问题导致频繁重试
使用shc工具可以将Shell脚本编译为二进制文件,提高安全性和执行效率。
# Ubuntu/Debian
apt update && apt install -y shc
# CentOS/RHEL
yum install -y shc
# 或者从源码编译安装
wget https://github.com/neurobin/shc/archive/refs/tags/4.0.3.tar.gz
tar -xzf 4.0.3.tar.gz
cd shc-4.0.3
make && make install# 编译脚本为二进制
shc -f /opt/audodns/autodns.sh -o /opt/audodns/autodns
# 设置执行权限
chmod +x /opt/audodns/autodns
# 测试二进制文件
/opt/audodns/autodns --help编译后的二进制文件autodns可以直接替代原脚本使用。
阿里云DNS自动更新脚本
功能:自动检测本机公网IP并更新阿里云DNS记录
用法:autodns.sh [选项]
选项:
-h, --help 显示帮助信息
-d, --domain DOMAIN 设置主域名,可多次使用
-r, --record RECORD 设置域名和主机记录,格式为:域名:主机名1,主机名2
-l, --log FILE 设置日志文件路径
--debug 启用调试模式
默认日志文件位于/var/log/autodns.log,可以通过-l选项指定自定义日志路径。
日志格式:YYYY-MM-DD_HH:MM:SS [日志级别] 日志信息
-
阿里云CLI工具不存在
- 脚本会自动尝试安装阿里云CLI工具,如安装失败,请手动安装
- 安装命令:
/bin/bash -c "$(curl -fsSL https://aliyuncli.alicdn.com/install.sh)"
-
凭证文件不存在
- 请按照提示配置阿里云凭证:
aliyun configure
- 请按照提示配置阿里云凭证:
-
DNS记录更新失败
- 检查阿里云凭证是否正确
- 确认域名在阿里云DNS控制台中存在且可管理
- 检查网络连接是否正常
- 定期检查日志文件,确保脚本正常运行
- 根据实际需求调整执行频率
- 当更换阿里云账号时,需要重新配置凭证
# 基本用法
/opt/audodns/autodns.sh -r example.com:www,mail
# 指定日志文件
/opt/audodns/autodns.sh -r example.com:www -l /var/log/mydns.log
# 启用调试模式
/opt/audodns/autodns.sh -r example.com:www --debug
# 查看帮助信息
/opt/audodns/autodns.sh --help
# 编译为二进制
shc -f /opt/audodns/autodns.sh -o /opt/audodns/autodns
# 启用定时器服务
systemctl enable autodns.timer
systemctl start autodns.timer
# 查看定时器状态
systemctl list-timers autodns.timer
# 手动执行一次
systemctl start autodns.service