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

    运行后结果是这样,不懂,求教。
    === Check aaa.hefp.cn ===
    Fetching Host Ip

    Host Ip: 240e:3b10:2044:41fa:e11c:2246:2506:bfe3
    Record Type: AAAA
    Fetching RecordId
    arDdnsLookup -

    1. 参考 https://github.com/rehiy/dnspod-shell/issues/113

  2. Test

    请问我执行命令后显示获取了正确的ip地址,而dnspod里的记录未被更新是什么原因?(已填写正确的id和token)

    1. Test

      打扰了,测试v6.1可以正常使用。::(狂汗)

  3. 深海

    昨天还可以用,今天出现了Host Ip: arWanIp4 - Can't get ip address,问下咋回事,我直接进入https://v4.myip.la等个几秒也能出ip地址,为啥报错了呢

    1. 脚本优先使用本地wan的ip,获取不到,才会从接口获取。可以更换一个你本地打开快一点的接口试试

      1. 脆皮

        我也是遇到同样的情况,换了其他接口也是一样,https://v4.myip.la我本地秒开,但是还是显示Host Ip: arWanIp4 – Can’t get ip address

  4. djxyy

    ddnspod.sh: line 14: arDdnsCheck: not found
    这是未获取到我的域名吗?是因为dnspod的api使用https的原因吗?我该如何解决?

    1. 可能是缺少了函数文件,你把项目里的2个脚本放一起即可

  5. qin.cj

    大佬们,这是什么问题啊???
    Domain Ids: arDdnsIds - {"status":{"code":"10","message":"\u8bb0\u5f55\u5217\u8868\u4e3a\u7a7a","created_at

    1. 可能需要选择网卡

    2. qin.cj

      解决了,是网卡选的不对。
      //运行ifconfig,查看具有IPv6地址的网卡设备名,例如eth0等
      //ddnspod.sh 69行,将 eth0 替换成本机的网卡设备名。确保单独运行该命令可以返回ipv6地址

  6. YB

    arDdnsIds - {"status":{"code":"8","message":"\u57df\u540d\u4e0d\u6b63\u786e\uff0c\u8bf7\u8f93\u5165\u4e3b\u57df\u540d\uff0c\u5982 dnspod.cn","created_at":"2021-08-15 01:34:34"}}

  7. 杨小果子

    因为ipv6有三个地址
    (第一个)inet6 240e:000:000a:26c0::114 prefixlen 128 scopeid 0x0
    (第二个)inet6 240e:000:000a:26c0:25dd:f3b1:7f79:d4d6 prefixlen 64 scopeid 0x0
    (本地地址)inet6 fe80::ac5b:4331:5f5d:115b prefixlen 64 scopeid 0x20
    shell会自动上传第一个v6地址,导致无法联通,如何修改为上传第二个v6地址呢

    1. 若海

      用 计算下长度,排除掉一个

  8. rong

    目前免费的DDNS 的TTL最低只能写到600秒,是不是这个原因导致报错 get record info failed。

    1. 若海

      可能和api变更有关系,你更新到最新的版本了么

      1. rong

        是最新版的,

        最近更新
        2020/1/1

        适配新版API(2019-11-26)
        当wget不存在时,尝试使用curl提交
        由于readlink不可靠,更改为手动设置路径
        当无法从本地网卡获得外网ip时,尝试从外部api获取

        1. 若海

          上个月合并了一个pull,解决这个问题

  9. rong

    经测试 a.abc.com 二级域名会出现 get record info failed abc.com 根域名不会

  10. rong

    我也一样是报错 get record info failed。

添加新评论