AI摘要:通过一个简单的shell脚本,可自动检测并更新DNSPod域名解析,实现动态域名解析,无需额外软件。脚本每5分钟运行一次,公网IP变化时通过邮件通知。
Powered by AISummary.
一、前言
玩nas的小伙伴想要远程访问自己的设备,最优解决方案就是公网ip再搭配个域名,动态域名解析的软件有很多,一般域名供应商官方都有ddns服务,但是都不太好用,有的还收费,第三方的比如ddns-go、lucky或者openwrt中的动态dns插件等等,免费也都挺好用,但实际上,域名解析没那么麻烦,只需要一个shell脚本就能解决,不需要任何软件。
我是腾讯的域名,如果你也是腾讯的域名,可以完全复制我的脚本,修改相应的token值即可。
具体操作如下:
1. 获取API密钥
首先,需要在DNSPod平台上获取API Token:
登录DNSPod官网。
进入用户中心,点击安全设置,找到API Token,并生成一个新的Token。
生成的Token包括两个部分:ID和Token。
2.安装依赖
sudo apt install -y curl jq mailutils
3. 编写DNSPod更新解析的Shell脚本
下面是一个用于更新DNSPod域名解析的Shell脚本,它会自动检测当前公网IP,并将其更新到DNSPod服务器。
sudo nano /home/.ddns_dnspod.sh
- 复制下面代码,注意看注释,需要修改你的域名、你的token的id和值,还有你的邮箱。
#!/bin/bash
while ! curl -s --head --request GET http://ipinfo.io/ip | grep "200 OK" > /dev/null; do
echo "Waiting for network connection..."
sleep 5
done
# DNSPod API Token
API_TOKEN="xxxxx,xxxxxxxxxxxxxxxxxx" # 逗号左边为token的id,右边为值
# 你的域名
DOMAIN="xxxxx.com" # 你的域名
SUB_DOMAIN="*" # 我要解析泛域名,因此这里用 * ,如果你不需要泛域名,可以改为 A
# 获取当前公网 IP
CURRENT_IP=$(curl -s http://ipinfo.io/ip)
# 获取 DNSPod 记录 ID 和 IP
echo "Fetching record info..."
RECORD_INFO=$(curl -s -X POST https://dnsapi.cn/Record.List \
-d "login_token=${API_TOKEN}&format=json&domain=${DOMAIN}&sub_domain=${SUB_DOMAIN}" \
-H "User-Agent: Mozilla/4.0")
# 检查是否获取成功
echo "RECORD_INFO: $RECORD_INFO"
RECORD_ID=$(echo "$RECORD_INFO" | jq -r '.records[0].id')
RECORD_IP=$(echo "$RECORD_INFO" | jq -r '.records[0].value')
# 如果记录不存在,创建新记录
if [ "$RECORD_ID" == "null" ] || [ -z "$RECORD_ID" ]; then
echo "Record does not exist, creating a new record."
CREATE_RESULT=$(curl -s -X POST https://dnsapi.cn/Record.Create \
-d "login_token=${API_TOKEN}&format=json&domain=${DOMAIN}&sub_domain=${SUB_DOMAIN}&value=${CURRENT_IP}&record_type=A&record_line=默认" \
-H "User-Agent: Mozilla/4.0")
STATUS=$(echo "$CREATE_RESULT" | jq -r '.status.code')
if [ "$STATUS" == "1" ]; then
echo "DNSPod record created successfully for $SUB_DOMAIN with IP $CURRENT_IP"
# 发送邮件通知
echo "A new DNS record for ${SUB_DOMAIN}.${DOMAIN} has been created with IP $CURRENT_IP" | \
mail -s "DDNS Record Created: ${SUB_DOMAIN}.${DOMAIN}" 12345678i@163.com # 换成自己的邮箱,公网ip变化后此邮箱会接到通知
else
echo "Failed to create DNSPod record. Response: $CREATE_RESULT"
fi
else
# 如果当前 IP 和 DNSPod 记录中的 IP 不一致,则更新
if [ "$CURRENT_IP" != "$RECORD_IP" ]; then
echo "Updating record with ID: $RECORD_ID"
UPDATE_RESULT=$(curl -s -X POST https://dnsapi.cn/Record.Modify \
-d "login_token=${API_TOKEN}&format=json&domain=${DOMAIN}&record_id=${RECORD_ID}&sub_domain=${SUB_DOMAIN}&value=${CURRENT_IP}&record_type=A&record_line=默认" \
-H "User-Agent: Mozilla/4.0")
STATUS=$(echo "$UPDATE_RESULT" | jq -r '.status.code')
if [ "$STATUS" == "1" ]; then
echo "DNSPod record updated successfully to $CURRENT_IP"
# 发送邮件通知
echo "Your IP has changed to $CURRENT_IP" | \
mail -s "DDNS Update: ${SUB_DOMAIN}.${DOMAIN}" 12345678i@163.com # 换成自己的邮箱,公网ip变化后此邮箱会接到通知
else
echo "Failed to update DNSPod record. Response: $UPDATE_RESULT"
fi
else
echo "No update needed. Current IP ($CURRENT_IP) matches DNSPod record."
fi
fi
- ctrl+o 保存
- ctrl+x 退出
二、创建计划任务
- 命令行输入:
crontab -e
- 将如下内容复制粘贴
*/5 * * * * /bin/bash /home/.ddns_dnspod.sh >> /home/.ddns_dnspod.log 2>&1
- ctrl+o 保存
ctrl+x 退出
三、代码解释
这段代码是一个 cron 任务的调度条目,用于在 Linux 系统上定期执行指定的命令。
*/5 :这是 cron 表达式,用于指定任务的调度频率。这里的 */5 表示每 5 分钟执行一次任务,其它星号表示每小时、每天、每月和每周的每一天都执行这个任务。
/bin/bash /home/.ddns_dnspod.sh:这是要执行的命令。/bin/bash 是用于运行脚本的 shell,/home/.ddns_dnspod.sh 是脚本文件的路径,表示要执行的脚本。
>> /home/.ddns_dnspod.log 2>&1:这是重定向输出的部分。
>> 表示将命令的标准输出(stdout)追加到 /home/.ddns_dnspod.log 文件中。如果文件不存在,它会被创建。
2>&1 表示将标准错误(stderr)重定向到标准输出(stdout),这样错误信息也会被追加到 /home/.ddns_dnspod.log 文件中。
这段 cron 任务的意思是每 5 分钟运行一次 /home/.ddns_dnspod.sh 脚本,并将脚本的标准输出和标准错误都追加到 /home/.ddns_dnspod.log 文件中,以便记录脚本的执行情况和任何可能发生的错误。
四、部署完毕
以上操作结束后,这个脚本每5分钟运行一次,并进行域名解析,如果公网ip有变化,会第一时间邮件通知你,注意邮件可能会被认为是垃圾邮件,邮箱内设置一下就好。