一个shell脚本搞定ddns动态域名解析

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服务器。

  1. sudo nano /home/.ddns_dnspod.sh
  2. 复制下面代码,注意看注释,需要修改你的域名、你的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
  1. ctrl+o 保存
  2. ctrl+x 退出

二、创建计划任务

  1. 命令行输入:crontab -e
  2. 将如下内容复制粘贴
    */5 * * * * /bin/bash /home/.ddns_dnspod.sh >> /home/.ddns_dnspod.log 2>&1
  3. ctrl+o 保存
  4. 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有变化,会第一时间邮件通知你,注意邮件可能会被认为是垃圾邮件,邮箱内设置一下就好。

打赏
评论区
头像
文章目录

本站已运行: