Linux纯Shell实现DNSPod动态域名

开发背景:

公司有台嵌入式拨号上网设备,内置busybox和完整wget命令(支持https协议),但没有curl、python、ruby、php等扩展工具可用。网上现有基于DNSPod实现的Linux脚本无法在该设备上运行,于是写了个Shell版动态域名客户端(ddnspod),现在发布出来希望能给需要的朋友带来一些方便。

项目源码:

https://github.com/anrip/dnspod-shell

DnsPod官方文档

https://support.dnspod.cn/Support/api

功能介绍:

  • 优雅的函数封装,灵活的更新策略
  • 基于DNSPod最新用户API实现动态域名客户端
  • 支持基于系统计划任务实现更新,防止脚本意外终止
  • 可运行于多数类unix系统中,包括部分嵌入式小型系统
  • 依赖sed/wget/nslookup命令,wget也可使用curl替代

更新说明:

2015年7月7日

  • 使用D+服务获取域名解析

2013年8月9日

  • 修正一处笔误

2013年8月8日

  • 默认DNS查询服务器更换为114.114.114.114

2013年5月23日

  • [[]]替换为[],防止一些嵌入设备无此命令

2013年4月1日

  • 完善说明文档
  • 优化全局变量定义
  • 刚发现DnsPod官方API示例已收录本文

2013年3月29日

  • 从dns服务器获取子域名IP
  • 实现仅IP变更后才提交更新

2013年3月28日

  • 现在是13年3月,故而第一个版本就定为v3.3吧
  • 使用APIv4.6实现简单的动态更新功能

常见问题:

record line invailid 将脚本保存为utf-8格式即可
Record id invalid 检查账号权限、是否冲突等

“Linux纯Shell实现DNSPod动态域名”的72个回复

  1. 若提示 [: not found ,请使用管理员权限运行,或使用 test 语法替代。

    [ “$A” = “$B” ] 等价于 test “$A” = “$B”

  2. 执行这一句wget –quiet –no-check-certificate –output-document=- $inter
    报错:
    Segmentation fault
    如果不加–no-check-certificate,则无错。

  3. “`
    hostIP: 131.143.134.35
    lastIP: 132.225.217.192#53***Can’tfindwww.songweiqi789.tk:Noanswer
    ./dns1.sh: 50: [: 26: unexpected operator
    postRS: Record line invalid
    “`

    是我的域名出问题了还是别的问题?请直接:qq179834480

  4. “`
    hostIP: 116.227.134.146
    lastIP: Server:114.114.114.114Address:114.114.114.114#53Non-authoritativeanswer:Name:y36.xchun.netAddress:113.121.42.19
    postRS: Record id invalid
    “`

    请问为什么会postRS: Record id invalid
    我用的是raspberry pi

  5. nslookup y36.xchun.net $dnsvr | tr -d ‘\n[:blank:]’ | sed ‘s/.\+1 \([0-9\.]\+\)/\1/’
    这里的y36.xchun.net是什么意思?是指自己的域名吗?

  6. lastIP: Server:114.114.114.114Address:114.114.114.114#53Non-authoritativeanswer:***Can’tfindlab.xxx.xxxx.com:Noanswer
    后面提示不能找到我的那个域名是什么意思啊??

  7. 试了下和看了下脚本,好像只能更新子域名?

    另外我两个linux环境,一个成功,另一个始终不成功。。。好奇怪。

    不成功的现象就是无法解析DNS

  8. 感谢楼主的分享,要是代码能放到github上,做成gist就好了,再代码里面加上自己更新代码的语句,那我们就可以及时获取更新了

  9. # 检查更新域名
    arDdnsCheck “anrip.com” “lab”
    arDdnsCheck “anrip.net” “lab”
    请问”lab”问题,如解析anrip.com和www.anrip.com, “lab”应该怎么添.
    “lab”替换成”www”,www.anrip.com可以正常,但是anrip.com没有被设置到位.
    如添加一行arDdnsCheck “anrip.com” “@”出现lastIP: Server:114.114.114.114Address:114.114.114.114#53Non-authoritativeanswer:***Can’tfind@.anrip.com:Noanswer
    或添加一行arDdnsCheck “anrip.com” “”,出现nslookup: ‘.anrip.com’ is not a legal name (unexpected end of input)
    hostIP: xx.xx.xx.xx
    lastIP:

    额外问下,我如添加系统启动,如何做到循环检测,比方说几分钟自动运行循环一遍.
    谢谢大佬了

    1. 目前脚本不支持更新主域名,后续我可以更新下支持。不过,不建议你去更新主域名的IP地址,可以做一条url转向。

      想要循环执行,可以添加一条系统的计划任务,Ubuntu下可以用 crontab -e

  10. 要么就出现wget: illegal option — –
    BusyBox V1.12.1
    Usage: wget [-csq] [-O file] [-Y on/off] [-P DIR] [-U agent] url

    1. root@OpenWrt:~# dnspod
      nslookup: can’t resolve ‘.leixunpc.com’: Name or service not known
      hostIP: 113.225.147.137
      lastIP: 114.114.114.114 puic1.114ds.com
      postRS: 113.225.147.137
      hostIP: 113.225.147.137
      lastIP: 113.225.147.137

      主域名 换成@ 和空格都有这样的提示

      1. 不能正常更新的LOG
        Jan 18 03:30:25 admin: 开始更新dnspod 的域名IP指向
        Jan 18 03:30:26 admin: 目前的IP: 106.88.200.95
        Jan 18 03:30:26 admin: 原来的IP: 125.84.13.184
        Jan 18 03:30:27 admin: 提交的IP:

        能正常更新的LOG
        Jan 18 03:31:11 admin: 开始更新dnspod 的域名IP指向
        Jan 18 03:31:11 admin: 目前的IP: 125.84.15.126
        Jan 18 03:31:11 admin: 原来的IP: 14.105.89.225
        Jan 18 03:31:14 admin: 125.84.15.126
        Jan 18 03:31:14 admin: 提交的IP:

  11. 没有使用说明呀。。我改了ddnspod.sh最后的设置用户参数ermail和erpass为dnspod的账户和密码,然后检查更新域名改成了自己的域名。运行起来有显示hostIP,lastIP不显示。postRS提示Record id invalid 失败了。CentOS 7

  12. 我想上面的原因可能是因为我在另外一台PC上也登陆了一个dnspodclient客户端导致的。将它停止后没有再报这个错误。

  13. 咨询一下:

    复制dns.conf.example到同一目录下的dns.conf并根据你的配置修改即可。

    同一目录下的dns.conf  这句话没明白。(新手不好意思)

  14. 感谢!在树莓派Raspbian 上完美工作。

    请教几个问题:1.我发现dnspod.com(国际版)的api和dnspod.cn是一样的,只是地址不同。所以我尝试使用dnspod.com的账户和api,并改动了ddnspod.sh第121行,结果(以账户、密码方式dns.conf):

    Linux
    hostIP: 116.12.x.x
    lastIP:
    postRS: Missing user token, login failed

    查源码,对比中英的api文档也找不到问题所在。我只是个初学者,请教有什么解决办法或者方向么?谢谢

  15. 如何把脚本改为直接读取wan口的ip,而不是在网站获取外网ip,因为路由有开ss,经常把ss的外网识别到域名上去,而不是真正的wan口自己拨号的外网ip。

  16. admin@CntR6300V2:/jffs/scripts# ./ddnspod.sh
    Linux
    ./ddnspod.sh: line 96: command: not found
    ./ddnspod.sh: line 96: command: not found
    ./ddnspod.sh: line 96: command: not found
    ./ddnspod.sh: line 96: command: not found
    ./ddnspod.sh: line 96: command: not found
    hostIP: 192.168.1.6 192.168.6.1
    lastIP:
    postRS: Record line invalid

    我出现这写问题,我的路由器的上级路由器链接外网

  17. admin@CntR6300V2:/jffs/scripts# ./ddnspod.sh
    Linux
    ddnspod.sh: line 96: command: not found
    ddnspod.sh: line 96: command: not found
    ddnspod.sh: line 96: command: not found
    ddnspod.sh: line 96: command: not found
    ddnspod.sh: line 96: command: not found
    hostIP: 192.168.1.6 192.168.6.1
    lastIP:
    postRS: Record line invalid

    我出现这写问题,我的路由器的上级路由器链接外网

  18. admin@CntR6300V2:/jffs/scripts# ./ddnspod.sh
    Linux
    ddnspod.sh: line 96: command: not found
    ddnspod.sh: line 96: command: not found
    ddnspod.sh: line 96: command: not found
    ddnspod.sh: line 96: command: not found
    ddnspod.sh: line 96: command: not found
    hostIP: 192.168.1.6 192.168.6.1
    lastIP:
    postRS: Record line invalid

    我出现这写问题,我的路由器的上级路由器链接外网

  19. root@OpenWrt:/usr/lib/ddns# ./ddnspod.sh
    Linux
    ./ddnspod.sh: /usr/lib/ddns/dns.conf: line 1: arToken=***********************: not found
    ./ddnspod.sh: /usr/lib/ddns/dns.conf: line 2: ip: not found
    ./ddnspod.sh: /usr/lib/ddns/dns.conf: line 2: ip: not found
    Updating Domain: .blocks
    hostIP:
    wget: can’t execute ‘openssl’: No such file or directory
    wget: error getting response: Connection reset by peer
    wget: can’t execute ‘openssl’: No such file or directory
    wget: error getting response: Connection reset by peer
    wget: can’t execute ‘openssl’: No such file or directory
    wget: error getting response: Connection reset by peer
    Get Record Info Failed!
    ./ddnspod.sh: /usr/lib/ddns/dns.conf: line 3: ip: not found
    ./ddnspod.sh: /usr/lib/ddns/dns.conf: line 3: ip: not found
    Updating Domain: *************
    hostIP:
    wget: can’t execute ‘openssl’: No such file or directory
    wget: error getting response: Connection reset by peer
    wget: can’t execute ‘openssl’: No such file or directory
    wget: error getting response: Connection reset by peer
    wget: can’t execute ‘openssl’: No such file or directory
    wget: error getting response: Connection reset by peer
    Get Record Info Failed!
    root@OpenWrt:/usr/lib/ddns# wget: can’t execute ‘openssl’: No such file or direc
    tory

      1. root@OpenWrt:/# /usr/lib/ddns/ddnspod.sh
        Linux
        /usr/lib/ddns/ddnspod.sh: /usr/lib/ddns/dns.conf: line 1: #: not found
        /usr/lib/ddns/ddnspod.sh: /usr/lib/ddns/dns.conf: line 8: ip: not found
        /usr/lib/ddns/ddnspod.sh: /usr/lib/ddns/dns.conf: line 8: ip: not found
        Updating Domain: **********
        hostIP:
        Get Record Info Failed!
        新问题
        貌似没有获取IP地址。

  20. 19年12月31日更新后就无法使用了!!提示
    root@raspbian:/home/pi/ddns# ./ddnspod.sh
    Type: A
    OS: Linux
    Address: 115.221.12.117
    Updating Domain: .Timcc.xyz
    hostIP: 115.221.12.117
    Get Record Info Failed!

发表评论

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