非常抱歉回复晚了
原荒野无灯的脚本修改返回值,脚本如下:
#!/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
大神,貌似你泄露了你的隐私呢
fuck 多谢提醒
大神,在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
你上面提供的代码,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
}
因为是小白,完全瞎折腾。 尝试修改了半天。还是不成功- -! 本来上面的代码是加到pavadan 内置阿里云解析脚本里的,能正常用。但是那个脚本好像有bug,同时解析一个域名v6 v4,会V6覆盖V4的地址。 现在想把群晖域名同时解析V6 V4,太难找办法了。 你用的V6获取方式,我手动试过获取 domin id 和record id。但最后不知道为啥V4成功,V6有问题。我再折腾下看看能改好不。 感谢大神热心回复 – –
获取了三个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。 是不是路由器或者群晖哪个地方配置缺少了?
你的 curl 的 post 参数中 value 的值没有指定,
最后“……&value=&sub_domain=@”,
“&value=” 后面应该接着解析出来的ipv6的地址,
所以应该是这样的
“……&value=ipv6地址&sub_domain=@”
是的,你提供的代码中,只有一个变量 (arIpAddress )用来保存IP地址(ipv4 或 ipv6不能同时存在),以下代码:
if [ “$IPv6” = “1” ] ; then
arIpAddress=${ipv6_16B}
else
arIpAddress=$(arIpAddress)
fi
的意思是如果有ipv6地址的话就会覆盖掉Ipv4地址。
我的脚本是Ipv4一个变量,ipv6一个变量。
本身是使用在梅林固件上的,梅林获取ipv6地址会有延迟,所以判断逻辑为:
只要Ipv4解析成功,通知路由器ddns解析成功;
而ipv6解析成功与否,不会进行通知,(在梅林上是可以成功解析的,其他固件未做测试)
我用博主上面修正过的这个脚本,路由提示注册成功但是云端没有解析记录,何解?
你指的是ipv4还是ipv6?
这个脚本是ipv4的动态解析,刚刚重新格式化,如果只需要iPv4可是试试这个修改过的
如果要双栈解析,直接去github上看吧,那个脚本ipv6的解析会有延迟,因为梅林固件获取ipv6会比较慢,一般要等个10分钟左右
已经同时解析V6,V4。 感谢大神的耐心回复 0 0