Linux 纯 Shell 实现 DNSPod 动态域名

开发背景:

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

项目源码:

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

DnsPod 官方文档

https://docs.dnspod.cn/api/update-dns-records/

功能介绍:

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

常见问题:

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

文章作者: 若海; 原文链接: https://www.rehiy.com/post/62/; 转载需声明来自技术写真 - 若海

已有 95 条评论

  1. 检查更新域名

    arDdnsCheck "example.com" "lab"
    arDdnsCheck "example.org" "lab"
    请问"lab"问题,如解析example.com和www.example.com, "lab"应该怎么添.
    "lab"替换成”www",www.example.com可以正常,但是example.com没有被设置到位.
    如添加一行arDdnsCheck "example.com" "@"出现lastIP: Server:114.114.114.114Address:114.114.114.114#53Non-authoritativeanswer:***Can'[email protected]:Noanswer
    或添加一行arDdnsCheck "example.com" "",出现nslookup: '.example.com' is not a legal name (unexpected end of input)
    hostIP: xx.xx.xx.xx
    lastIP:

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

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

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

  2. neilzhang

    非常感谢,在NAS上面部署了,运作很完美!

  3. crazygit

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

    1. 可以的,我整理下

  4. pan

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

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

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

  5. gao_m1

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

    1. 应该是无法解析域名造成的

  6. surpass_hww

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

    1. 是的,换成自己的域名即可

  7. 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

    1. 这个是从dns服务器返回当前解析记录出错,请告知你的版子使用的系统信息,我测试下。

  8. 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

    1. [:错误,是系统无命令造成的,尝试使用管理员账号执行或删除[和]命令。参考一楼回复的方法。

  9. shenzhi

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

    1. 需要wget支持才能获取到远程的url信息,若系统不支持wget,也可以用curl替换。

  10. 写的不错!

添加新评论