关于 windu 童鞋的回复

非常抱歉回复晚了

原荒野无灯的脚本修改返回值,脚本如下:


#!/bin/sh

#################################################
# AnripDdns v5.08
# 基于DNSPod用户API实现的动态域名客户端
# 作者: 若海[mail@anrip.com]
# 介绍: http://www.anrip.com/ddnspod
# 时间: 2016-02-24 16:25:00
# Mod: 荒野无灯 http://ihacklog.com  2016-03-16
#################################################

# 使用Token认证(推荐) 请去 https://www.dnspod.cn/console/user/security 获取
arToken="*****,***************"
# 使用邮箱和密码认证
arMail=""
arPass=""

# 获得外网地址
arIpAdress() {
    local inter=`nvram get wan0_ipaddr`
    echo $inter
}

# 查询域名地址
# 参数: 待查询域名
arNslookup() {
    local inter="http://119.29.29.29/d?dn="
    wget --quiet --output-document=- $inter$1
}

# 读取接口数据
# 参数: 接口类型 待提交数据
arApiPost() {
    local agent="AnripDdns/5.07(mail@anrip.com)"
    local inter="https://dnsapi.cn/${1:?'Info.Version'}"
    if [ "x${arToken}" = "x" ]; then # undefine token
        local param="login_email=${arMail}&login_password=${arPass}&format=json&${2}"
    else
        local param="login_token=${arToken}&format=json&${2}"
    fi
    wget --quiet --no-check-certificate --output-document=- --user-agent=$agent --post-data $param $inter
}

# 更新记录信息
# 参数: 主域名 子域名
arDdnsUpdate() {
    local domainID recordID recordRS recordCD
    # 获得域名ID
    domainID=$(arApiPost "Domain.Info" "domain=${1}")
    domainID=$(echo $domainID | sed 's/.\+{"id":"\([0-9]\+\)".\+/\1/')
    # 获得记录ID
    recordID=$(arApiPost "Record.List" "domain_id=${domainID}&sub_domain=${2}")
    recordID=$(echo $recordID | sed 's/.\+\[{"id":"\([0-9]\+\)".\+/\1/')
    # 更新记录IP
    recordRS=$(arApiPost "Record.Ddns" "domain_id=${domainID}&record_id=${recordID}&sub_domain=${2}&record_line=默认")
    recordCD=$(echo $recordRS | sed 's/.\+{"code":"\([0-9]\+\)".\+/\1/')
    # 输出记录IP
    if [ "$recordCD" == "1" ]; then
        echo $recordRS | sed 's/.\+,"value":"\([0-9\.]\+\)".\+/\1/'
        return 1
    fi
    # 输出错误信息
    echo $recordRS | sed 's/.\+,"message":"\([^"]\+\)".\+/\1/'
}

# 动态检查更新
# 参数: 主域名 子域名
arDdnsCheck() {
    local postRS
    local hostIP=$(arIpAdress)
    local lastIP=$(arNslookup "${2}.${1}")
    echo "hostIP: ${hostIP}"
    echo "lastIP: ${lastIP}"
    if [ "$lastIP" != "$hostIP" ]; then
        postRS=$(arDdnsUpdate $1 $2)
        echo "postRS: ${postRS}"
        if [ $? -ne 1 ]; then
            return 1
        fi
    fi
    return 0
}

###################################################
# 检查更新域名

arDdnsCheck "frostfall.cn" ""

if [ $? -eq 1 ]; then
    /sbin/ddns_custom_updated 1
else
    /sbin/ddns_custom_updated 0
fi


11 评论

  1. 因为是小白,完全瞎折腾。 尝试修改了半天。还是不成功- -! 本来上面的代码是加到pavadan 内置阿里云解析脚本里的,能正常用。但是那个脚本好像有bug,同时解析一个域名v6 v4,会V6覆盖V4的地址。 现在想把群晖域名同时解析V6 V4,太难找办法了。 你用的V6获取方式,我手动试过获取 domin id 和record id。但最后不知道为啥V4成功,V6有问题。我再折腾下看看能改好不。 感谢大神热心回复 – –

    1. 获取了三个ID 用了curl -s -X POST “https://dnsapi.cn/Record.Modify” -d “login_token=&format=xml&domain_id=&record_id=&record_type=AAAA&record_line=%e9%bb%98%e8%ae%a4&value=&sub_domain=@” 来手动更新域名。提示{“status”:{“code”:”17″,”message”:”Record value is invalid”,”created_at”:”2。 是不是路由器或者群晖哪个地方配置缺少了?

      1. 你的 curl 的 post 参数中 value 的值没有指定,
        最后“……&value=&sub_domain=@”,
        “&value=” 后面应该接着解析出来的ipv6的地址,
        所以应该是这样的
        “……&value=ipv6地址&sub_domain=@”

    2. 是的,你提供的代码中,只有一个变量 (arIpAddress )用来保存IP地址(ipv4 或 ipv6不能同时存在),以下代码:
      if [ “$IPv6” = “1” ] ; then
      arIpAddress=${ipv6_16B}
      else
      arIpAddress=$(arIpAddress)
      fi
      的意思是如果有ipv6地址的话就会覆盖掉Ipv4地址。
      我的脚本是Ipv4一个变量,ipv6一个变量。
      本身是使用在梅林固件上的,梅林获取ipv6地址会有延迟,所以判断逻辑为:
      只要Ipv4解析成功,通知路由器ddns解析成功;
      而ipv6解析成功与否,不会进行通知,(在梅林上是可以成功解析的,其他固件未做测试)

      1. 我用博主上面修正过的这个脚本,路由提示注册成功但是云端没有解析记录,何解?

        1. 你指的是ipv4还是ipv6?
          这个脚本是ipv4的动态解析,刚刚重新格式化,如果只需要iPv4可是试试这个修改过的
          如果要双栈解析,直接去github上看吧,那个脚本ipv6的解析会有延迟,因为梅林固件获取ipv6会比较慢,一般要等个10分钟左右

  2. 大神,在H大Padavan上使用这个脚本,ipv6地址不会解析。V4都ok 。是不通用吗?
    用下面的代码能准确的解析V6地址 我小白一个,捣鼓了半天,不会移植一起。大神看看好替代吗?
    # IPv6地址获取
    # 因为一般ipv6没有nat ipv6的获得可以本机获得
    #ifconfig $(nvram get wan0_ifname_t) | awk ‘/Global/{print $3}’ | awk -F/ ‘{print $1}’
    # wan0_ifname_t为虚拟ipv6地址 br0_ifname_t为实际ipv6公网地址 cut -b 0-19是获取路由器ipv6地址的前20个字符正好是前64位
    ifconfig $(nvram get br0_ifname_t) | awk ‘/Global/{print $3}’ | awk -F/ ‘{print $1}’|cut -b 0-19
    }
    # 需要DDNS的主机ipv6后64位 ——-此处需要修改 其他无视——-
    Host_ipv6=1111:1111:1111:1111
    # 路由器重新拨号获取的ipv6前64位
    Router_arIpAddress6=$(arIpAddress6)
    # 直接通过路由器命令获取的ipv6前64可能是类型不同不能直接和主机ipv6拼接一起需要处理一下
    Router_ipv6=${Router_arIpAddress6:0:19}
    # 将处理后的路由器ipv6前64位和需要DDNS的ipv6主机后64位拼接一起
    ipv6_16B=${Router_ipv6}${Host_ipv6}

    if [ “$IPv6” = “1” ] ; then
    arIpAddress=${ipv6_16B}
    else
    arIpAddress=$(arIpAddress)
    fi

    1. 你上面提供的代码,ipv6_16B是最终获得的ipv6地址,与原脚本中hostIP_v6相同
      目前手头上没有padavan,只能大致写一下,如果有问题的话,你照着这个思路做一下
      重要:未做测试,可能自己需调试一下
      将原脚本arIpAdress_v6函数改写如下:
      # 获得外网ipv6地址
      arIpAdress_v6() {
      # 获取路由器ipv6地址
      Router_arIpAddress6=ifconfig $(nvram get wan0_ifname_t) | awk ‘/Global/{print $3}’ | awk -F/ ‘{print $1}’
      # 截取路由器ipv6前64位
      Router_ipv6=${Router_arIpAddress6:0:19}
      # 获取主机ipv6后64位
      Host_ipv6=1111:1111:1111:1111
      # 拼接
      ipv6_16B=${Router_ipv6}${Host_ipv6}
      # 检测,赋值给hostIP_v6
      if [ “$IPv6” = “1” ] ; then
      hostIP_v6=${ipv6_16B}

      echo $hostIP_v6
      }

发表评论

电子邮件地址不会被公开。 必填项已用*标注