使用老毛子在腾讯云DNSpod上实现DDNS_ardnspod-程序员宅基地

技术标签: 服务器运维  http  网络协议  

使用老毛子在腾讯云DNSpod上实现DDNS

需求:
1. 一台刷了老毛子的路由器
2. 腾讯云上购买的域名

最近申请了电信的动态公网IP,就想着我之前买的域名可以用起来了,于是乎查阅资料在路由器上实现了DDNS

  1. 首先在GitHub上搜索DDNS,找到了一个可用的shell脚本rehiy/dnspod-shell为了方便拷贝到路由器,按照作者的方法把配置融合进了单文件内,文件修改好备用

  2. 复制进老毛子,浏览器输入192.168.123.1进入老毛子管理界面,依次点击高级设置中的系统管理-服务-启用ssh服务选择“是”
    image-20220412112052854

  3. 打开FinalShell或者其他ssh软件登录路由器,选择新建ssh连接,地址就是192.168.123.1,用户名密码就是你设置的密码,进入之后把改好的.sh文件复制到路由器/etc/storage/目录下

  4. 在计划任务那里输入*/10 * * * * /etc/storage/ardnspod.sh代表10分钟运行一次,最后点击“应用本页面设置”即可。
    image-20220412112630658

  5. 最后为了能够方便管理,我把代码的输出改到了系统日志输出,这样就可以在路由器管理界面看到运行效果啦
    image-20220412113138042
    改过的代码我放在最后,只需要改最后两行的arTokenarDdnsCheck即可,arToken可以登录DNSpod点击右上角我的账号-api密钥
    image-20220412114044256
    然后选择创建DNSpod Token即可获取,arToken格式为ID,Token在这里插入图片描述
    如果感觉不错的话请点个小imgimg哈。

#!/bin/sh
#

#############################################################
# AnripDdns v6.1.1
#
# Dynamic DNS using DNSPod API
#
# Author: Rehiy, https://github.com/rehiy
#                https://www.anrip.com/?s=dnspod
# Collaborators: ProfFan, https://github.com/ProfFan
#
# Usage: please refer to `ddnspod.sh`
#
#############################################################



# TokenID,Token

export arToken=""

# Get WAN IPv4

arWanIp4() {

    local hostIp

    local lanIps="^$"

    lanIps="$lanIps|(^10\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$)"
    lanIps="$lanIps|(^127\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$)"
    lanIps="$lanIps|(^169\.254\.[0-9]{1,3}\.[0-9]{1,3}$)"
    lanIps="$lanIps|(^172\.(1[6-9]|2[0-9]|3[0-1])\.[0-9]{1,3}\.[0-9]{1,3}$)"
    lanIps="$lanIps|(^192\.168\.[0-9]{1,3}\.[0-9]{1,3}$)"

    case $(uname) in
        'Linux')
            hostIp=$(ip -o -4 addr list | grep -Ev '\s(docker|lo)' | awk '{print $4}' | cut -d/ -f1 | grep -Ev "$lanIps")
        ;;
        Darwin|FreeBSD)
            hostIp=$(ifconfig | grep "inet " | grep -v 127.0.0.1 | awk '{print $2}' | grep -Ev "$lanIps")
        ;;
    esac

    if [ -z "$hostIp" ]; then
        if type wget >/dev/null 2>&1; then
            hostIp=$(wget -q -O- https://v4.myip.la)
        else
            hostIp=$(curl -s https://v4.myip.la)
        fi
    fi

    if [ -z "$hostIp" ]; then
        echo "arWanIp4 - Can't get ip address"
        logger -t DNSpod_DDNS "无法获取ip地址"
        return 1
    fi

    if [ -z "$(echo $hostIp | grep -E '^[0-9\.]+$')" ]; then
        echo "arWanIp4 - Invalid ip address $hostIp"
        logger -t DNSpod_DDNS "无效ip地址:$hostIp"
        return 1
    fi

    echo $hostIp

}

# Get WAN IPv6

arWanIp6() {

    local hostIp

    local lanIps="(^$)|(^::1$)|(^[fF][eE][8-9a-fA-F])"

    case $(uname) in
        'Linux')
            hostIp=$(ip -o -6 addr list | grep -Ev '\s(docker|lo)' | awk '{print $4,substr($NF,0,length($NF)-3)}' | sed 's/fore/2592000/g' | sort -k 2 -n | cut -d/ -f1 | grep -Ev "$lanIps" | head -n 1)
        ;;
        Darwin|FreeBSD)
            hostIp=$(ifconfig | grep "inet6 " | awk '{print $2}' | grep -Ev "$lanIps" | head -n 1)
        ;;
    esac

    if [ -z "$hostIp" ]; then
        if type wget >/dev/null 2>&1; then
            hostIp=$(wget -q -O- https://v6.myip.la)
        else
            hostIp=$(curl -s https://v6.myip.la)
        fi
    fi

    if [ -z "$hostIp" ]; then
        echo "arWanIp6 - Can't get ip address"
        return 1
    fi

    if [ -z "$(echo $hostIp | grep -E '^[0-9a-fA-F:]+$')" ]; then
        echo "arWanIp6 - Invalid ip address"
        return 1
    fi

    echo $hostIp

}

# Dnspod Bridge
# Args: type data

arDdnsApi() {

    local agent="AnripDdns/6.1.0([email protected])"

    local apiurl="https://dnsapi.cn/${1:?'Info.Version'}"
    local params="login_token=$arToken&format=json&$2"

    if type wget >/dev/null 2>&1; then
        wget -q -O- --no-check-certificate -U $agent --post-data $params $apiurl
    else
        curl -s -A $agent -d $params $apiurl
    fi

}

# Fetch Ids of Domain and Record
# Args: recordType domain subdomain

arDdnsIds() {

    local errMsg

    local domainId
    local recordId

    # Get Domain Id
    domainId=$(arDdnsApi "Domain.Info" "domain=$2")
    domainId=$(echo $domainId | sed 's/.*"id":"\([0-9]*\)".*/\1/')

    if ! [ "$domainId" -gt 0 ] 2>/dev/null ;then
        errMsg=$(echo $domainId | sed 's/.*"message":"\([^\"]*\)".*/\1/')
        echo "arDdnsIds - $errMsg"
        logger -t DNSpod_DDNS "arDdnsIds - $errMsg"
        return 1
    fi

    # Get Record Id
    recordId=$(arDdnsApi "Record.List" "domain_id=$domainId&sub_domain=$3&record_type=$1")
    recordId=$(echo $recordId | sed 's/.*"id":"\([0-9]*\)".*/\1/')

    if ! [ "$recordId" -gt 0 ] 2>/dev/null ;then
        errMsg=$(echo $recordId | sed 's/.*"message":"\([^\"]*\)".*/\1/')
        echo "arDdnsIds - $errMsg"
        logger -t DNSpod_DDNS "arDdnsIds - $errMsg"
        return 1
    fi

    echo $domainId $recordId
    logger -t DNSpod_DDNS "$domainId $recordId"
}

# Fetch Record Ip
# Args: domainId recordId

arDdnsRecordIp() {

    local errMsg

    local recordIp

    # Get Record Ip
    recordIp=$(arDdnsApi "Record.Info" "domain_id=$1&record_id=$2")
    recordIp=$(echo $recordIp | sed 's/.*,"value":"\([0-9a-fA-F\.\:]*\)".*/\1/')

    # Output Record Ip
    case "$recordIp" in
        [0-9a-fA-F]*)
            echo $recordIp
            logger -t DNSpod_DDNS "$recordIp"
            return 0
        ;;
        *)
            errMsg=$(echo $recordIp | sed 's/.*"message":"\([^\"]*\)".*/\1/')
            echo "arDdnsRecordIp - $errMsg"
            logger -t DNSpod_DDNS "arDdnsRecordIp - $errMsg"
            return 1
        ;;
    esac

}

# Update Record Ip
# Args: domainId recordId subdomain hostIp recordType

arDdnsUpdate() {

    local errMsg

    local recordRs
    local recordIp
    local recordCd

    if [ -z "$5" ]; then
        echo "arDdnsUpdate - Args number error"
        logger -t DNSpod_DDNS "arDdnsUpdate - Args number error"
        return 1
    fi

    # Update Ip
    recordRs=$(arDdnsApi "Record.Modify" "domain_id=$1&record_id=$2&sub_domain=$3&record_type=$5&value=$4&record_line=%e9%bb%98%e8%ae%a4")
    recordIp=$(echo $recordRs | sed 's/.*,"value":"\([0-9a-fA-F\.\:]*\)".*/\1/')
    recordCd=$(echo $recordRs | sed 's/.*{"code":"\([0-9]*\)".*/\1/')

    # Output Result
    if [ "$recordIp" = "$4" ] && [ "$recordCd" = "1" ]; then
        echo "arDdnsUpdate - success"
        logger -t DNSpod_DDNS "arDdnsUpdate - success"
        return 0
    else
        errMsg=$(echo $recordRs | sed 's/.*,"message":"\([^"]*\)".*/\1/')
        echo "arDdnsUpdate - $errMsg"
        logger -t DNSpod_DDNS "arDdnsUpdate - $errMsg"
        return 1
    fi

}

# DDNS Check
# Args: Main Sub
arDdnsCheck() {

    local errCode

    local recordType
    local hostIp

    local ddnsIds
    local lastIp
    local postRs

    echo "Fetching Host Ip"
    logger -t DNSpod_DDNS "获取主机IP"
    if [ "$3" = "6" ]; then
        recordType=AAAA
        hostIp=$(arWanIp6)
    else
        recordType=A
        hostIp=$(arWanIp4)
    fi

    errCode=$?
    echo "> Host Ip: $hostIp"
    logger -t DNSpod_DDNS "主机IP: $hostIp"
    echo "> Record Type: $recordType"
    logger -t DNSpod_DDNS "记录类型: $recordType"
    if [ $errCode -ne 0 ]; then
        return 1
    fi

    echo "Fetching Ids of $2.$1"
    logger -t DNSpod_DDNS "抓取Id: $2.$1"
    ddnsIds=$(arDdnsIds "$recordType" "$1" "$2")

    errCode=$?
    echo "> Domain Ids: $ddnsIds"
    logger -t DNSpod_DDNS "域名Ids: $ddnsIds"
    if [ $errCode -ne 0 ]; then
        return 1
    fi

    echo "Checking Record for $2.$1"
    logger -t DNSpod_DDNS "检查记录:$2.$1"
    lastIp=$(arDdnsRecordIp $ddnsIds)

    errCode=$?
    echo "> Last Ip: $lastIp"
    logger -t DNSpod_DDNS "上一次的IP: $lastIp"
    if [ $errCode -ne 0 ]; then
        return 1
    fi

    if [ "$lastIp" = "$hostIp" ]; then
        echo "> Last Ip is the same as host Ip"
        logger -t DNSpod_DDNS "> 上一次的IP与主机记录值相同 <"
        return 0
    fi

    echo "Updating Record for $2.$1"
    logger -t DNSpod_DDNS "Updating Record for $2.$1"
    postRs=$(arDdnsUpdate $ddnsIds "$2" "$hostIp" "$recordType")

    errCode=$?
    echo "> $postRs"
    logger -t DNSpod_DDNS "> $postRs"
    if [ $errCode -ne 0 ]; then
        return 1
    fi

}
arToken=12345,7676f344eaeaea9074c123451234512d
arDdnsCheck test.org subdomain
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/BLC0202/article/details/124120121

智能推荐

详解冬奥冠军背后的AI黑科技-程序员宅基地

文章浏览阅读3.6k次。用人工智能普惠体育发展。

form表单提交的几种方式_提交表单-程序员宅基地

文章浏览阅读10w+次,点赞92次,收藏495次。表单提交方式一:直接利用form表单提交html页面代码:<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Insert title here</title></head><body><form action="h..._提交表单

Unity Spine SkeletonGraphic 动画重复播放 过度残影透明渐变Bug 解决方案_unity skeletongraphic-程序员宅基地

文章浏览阅读5.1k次。Unity Spine SkeletonGraphic 重复播放 过度残影Bug 解决方案不推荐使用SetToSetupPose和Setup Pose相关,代码直接贴上/// <summary>/// Spine播放设置/// </summary>/// <param name="trackIndex">填写0</param>/// <param name="animationName">动画名</param>/// &l_unity skeletongraphic

高斯分布3——边缘概率与条件概率_高斯分布的条件概率-程序员宅基地

文章浏览阅读3.5k次。一、推导过程:二、结果:边缘分布x1,x2 各自依然服从 μi,写反差矩阵 Σii 的多元高斯分布;条件概率分布给定 xj 求 xi 的分布:μi|j=μi+ΣijΣ−1jj(xj−μj)Σi|j=Σjj−ΣTijΣ−1iiΣij..._高斯分布的条件概率

Ratelimitcache: Python缓存库,支持速率限制-程序员宅基地

文章浏览阅读339次,点赞8次,收藏8次。Ratelimitcache: Python缓存库,支持速率限制项目链接: https://gitcode.com/simonw/ratelimitcache?utm_source=artical_gitcode如果你正在寻找一个Python缓存库,并且希望对缓存操作进行速率限制,那么Ratelimitcache可能是你的理想选择。什么是Ratelimitcache?Ratelimitca..._python ratelimit基于什么

【爬虫】Xpath和CSS信息提取的方法异同点_xpath 获取css-程序员宅基地

文章浏览阅读2.3k次,点赞2次,收藏8次。Xpath和CSS信息提取的方法异同点_xpath 获取css

随便推点

基于OFDM+64QAM系统的载波同步matlab仿真,输出误码率,星座图,鉴相器,锁相环频率响应以及NCO等-程序员宅基地

文章浏览阅读454次。正交频分复用(OFDM)是一种在现代通信系统中广泛使用的调制技术,它具有高效的频谱利用和抗多径衰落等特点。64QAM(64-ary Quadrature Amplitude Modulation)是一种调制方式,可以在每个符号中传输更多的位信息。在OFDM系统中,保持载波同步对确保数据传输的可靠性至关重要。_基于ofdm+64qam系统的载波同步matlab仿真,

Springboot毕设项目超市商品销售管理系统37x2w(java+VUE+Mybatis+Maven+Mysql)_vue+springboot+mybatis商品管理系统-程序员宅基地

文章浏览阅读67次。Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。若包含,则为maven项目,否则为非maven项目。Springboot毕设项目超市商品销售管理系统37x2w(java+VUE+Mybatis+Maven+Mysql)Springboot + mybatis + Maven + Vue 等等组成,B/S模式 + Maven管理等等。其他版本理论上也可以。_vue+springboot+mybatis商品管理系统

关掉\禁用win7自动配置ipv4地址的方法 默认网关自动消失的解决办法_禁止修改网关命令-程序员宅基地

文章浏览阅读3w次,点赞2次,收藏4次。转载自: http://blog.csdn.net/zouqin369/article/details/6913692 今天去公司设置好IP后,无论怎么样都上不了internet,再次打开本地后发现默认网关自动消失,cmd下输入ipconfig后的现象如下: 物理地址. . . . . . . . . . . . . : 00-22-64-55-76-8F DHCP 已启用_禁止修改网关命令

Extjs4.2 window加载HTML,父子页面html传参_extjs中打开网页怎么传参-程序员宅基地

文章浏览阅读482次。Extjs的窗口是可以加载自己的HTML的,但这样两个页面就相当独立了,传参是个问题 ,网上也没有很好的解答清楚,猫猫今天就说清楚这个模式的传参要点。_extjs中打开网页怎么传参

计算机网络复习——Ch3点到点数据链路层_hdlc go-back-n-程序员宅基地

文章浏览阅读1.2k次。Ch3点到点数据链路层知识点1. 点到点数据链路层要解决的主要问题2. 常见的帧管理(帧定界)方法3. CRC的计算4. 流量控制的基本原理5. 常见错误及其处理机制6. 滑动窗口的概念、形式及工作原理7. ARQ(Automatic Repeat reQuest)协议工作原理:8. 连续ARQ(Go-back-N ARQ)工作原理(特别注意累计确认):9. 选择重传ARQ工作原理10. 了解(高..._hdlc go-back-n

推荐文章

热门文章

相关标签