使用shell实现阿里云动态DNS

2023-05-16

https://github.com/timwai/aliyunDDNS-shell
脚本全部使用基础的命令实现,支持在openwrt中使用
修改以下参数为你自己的参数

ACCESS_KEY_ID=“你的AccessKeyId”
ACCESS_SECRET=“你的AccessSecret”
DOMAIN_NAME=“example.com”
RR=“www”
TYPE=“A”

也可在执行时覆盖以上参数

sh alidns.sh -rr www -domian examole.com -type A -id 你的AccessKeyId -secret 你的AccessSecret

#!/bin/bash
#
#####################################################################
#
#Author:                Tingjusting
#Email:                 tingjusting@gmail.com
#Date:                  2023-02-17
#FileName:             alidns.sh
#URL:                   https://github.com/ledrsnet
#Description:          阿里云DDNS
#Copyright (C):         2023 All rights reserved
#Signature Api:         https://help.aliyun.com/document_detail/315526.html
#Alidns Api:           https://next.api.aliyun.com/document/Alidns/2015-01-09
#
#####################################################################

ACCESS_KEY_ID="你的AccessKeyId"
ACCESS_SECRET="你的AccessSecret"
DOMAIN_NAME="example.com"
RR="www"
TYPE="A" #A为ipv4,AAAA为ipv6

while [[ $# -gt 0 ]];
do
  case $1 in
    -id|-AccessKeyId)
      ACCESS_KEY_ID=$2
      shift
      shift
      ;;
    -secret|-AccessSecret)
      ACCESS_SECRET=$2
      shift
      shift
      ;;
    -domain|-DomainName)
      DOMAIN_NAME=$2
      shift
      shift
      ;;
    -rr|-RR)
      RR=$2
      shift
      shift
      ;;
    -type|-Type)
      TYPE=$2
      shift
      shift
      ;;
    *)
      shift
      shift
    ;;
  esac
done

if [[ $TYPE == "AAAA" ]]; then
    #IP=`curl -sS https://ipv6.netarm.com/`
    IP=`ip -6 addr|grep dynamic|grep -m1 '/128'|awk '{print $2}'|cut -d'/' -f1`
    if [[ ! $IP ]]; then
      IP=`ip -6 addr|grep dynamic|grep -m1 '/64'|awk '{print $2}'|cut -d'/' -f1`
    fi
else
    IP=`curl -sS https://ipv4.netarm.com/`
fi

if [[ ! $IP ]]; then
    echo "Can not get the ip of type $TYPE"
    exit 1
fi

urlEncode() {
  # 将输入的字符串转换为16进制编码的值
  local length="${#1}"
  length=$((length-1))
  for i in $(seq 0 $length)
  do
    local c="${1:i:1}"
    case $c in
      [a-zA-Z0-9.~_-])
        printf "$c"
        ;;
      *)
        printf '%%%02X' "'$c"
        ;;
    esac
  done
}


DescribeDomainRecords(){
    URL_PARAMS="AccessKeyId=${ACCESS_KEY_ID}"
    URL_PARAMS="${URL_PARAMS}&Action=DescribeDomainRecords"
    URL_PARAMS="${URL_PARAMS}&DomainName=${DOMAIN_NAME}"
    URL_PARAMS="${URL_PARAMS}&Format=JSON"
    URL_PARAMS="${URL_PARAMS}&RRKeyWord=$RR"
    URL_PARAMS="${URL_PARAMS}&SignatureMethod=HMAC-SHA1"
    URL_PARAMS="${URL_PARAMS}&SignatureNonce="`date +%s%3N`
    URL_PARAMS="${URL_PARAMS}&SignatureVersion=1.0"
    URL_PARAMS="${URL_PARAMS}&Timestamp="`urlEncode $(date -u +"%Y-%m-%dT%H:%M:%SZ")`
    URL_PARAMS="${URL_PARAMS}&Type=$TYPE"
    URL_PARAMS="${URL_PARAMS}&Version=2015-01-09"

    STRING_To_SIGN="GET&%2F&`urlEncode ${URL_PARAMS}`"

    SIGNATURE=`echo -n ${STRING_To_SIGN} | openssl dgst -hmac "${ACCESS_SECRET}&" -sha1 -binary | openssl enc -base64`
    SIGNATURE=`urlEncode $SIGNATURE`

    URL_PARAMS="${URL_PARAMS}&Signature=${SIGNATURE}"
    curl -ss "http://alidns.aliyuncs.com?${URL_PARAMS}"
}

UpdateDomainRecord(){
    URL_PARAMS="AccessKeyId=${ACCESS_KEY_ID}"
    URL_PARAMS="${URL_PARAMS}&Action=UpdateDomainRecord"
    URL_PARAMS="${URL_PARAMS}&Format=JSON"
    URL_PARAMS="${URL_PARAMS}&RR=$RR"
    URL_PARAMS="${URL_PARAMS}&RecordId=$1"
    URL_PARAMS="${URL_PARAMS}&SignatureMethod=HMAC-SHA1"
    URL_PARAMS="${URL_PARAMS}&SignatureNonce="`date +%s%3N`
    URL_PARAMS="${URL_PARAMS}&SignatureVersion=1.0"
    URL_PARAMS="${URL_PARAMS}&Timestamp="`urlEncode $(date -u +"%Y-%m-%dT%H:%M:%SZ")`
    URL_PARAMS="${URL_PARAMS}&Type=$TYPE"
    URL_PARAMS="${URL_PARAMS}&Value=`urlEncode $IP`"
    URL_PARAMS="${URL_PARAMS}&Version=2015-01-09"

    STRING_To_SIGN="GET&%2F&`urlEncode ${URL_PARAMS}`"
    
    SIGNATURE=`echo -n ${STRING_To_SIGN} | openssl dgst -hmac "${ACCESS_SECRET}&" -sha1 -binary | openssl enc -base64`
    SIGNATURE=`urlEncode $SIGNATURE`

    URL_PARAMS="${URL_PARAMS}&Signature=${SIGNATURE}"
    curl -ss "http://alidns.aliyuncs.com?${URL_PARAMS}"
}

AddDomainRecord(){
    URL_PARAMS="AccessKeyId=${ACCESS_KEY_ID}"
    URL_PARAMS="${URL_PARAMS}&Action=AddDomainRecord"
    URL_PARAMS="${URL_PARAMS}&DomainName=${DOMAIN_NAME}"
    URL_PARAMS="${URL_PARAMS}&Format=JSON"
    URL_PARAMS="${URL_PARAMS}&RR=$RR"
    URL_PARAMS="${URL_PARAMS}&SignatureMethod=HMAC-SHA1"
    URL_PARAMS="${URL_PARAMS}&SignatureNonce="`date +%s%3N`
    URL_PARAMS="${URL_PARAMS}&SignatureVersion=1.0"
    URL_PARAMS="${URL_PARAMS}&Timestamp="`urlEncode $(date -u +"%Y-%m-%dT%H:%M:%SZ")`
    URL_PARAMS="${URL_PARAMS}&Type=$TYPE"
    URL_PARAMS="${URL_PARAMS}&Value=`urlEncode $IP`"
    URL_PARAMS="${URL_PARAMS}&Version=2015-01-09"

    STRING_To_SIGN="GET&%2F&`urlEncode ${URL_PARAMS}`"
    
    SIGNATURE=`echo -n ${STRING_To_SIGN} | openssl dgst -hmac "${ACCESS_SECRET}&" -sha1 -binary | openssl enc -base64`
    SIGNATURE=`urlEncode $SIGNATURE`

    URL_PARAMS="${URL_PARAMS}&Signature=${SIGNATURE}"
    curl -ss "http://alidns.aliyuncs.com?${URL_PARAMS}"
}

RECORDS=$(DescribeDomainRecords)

if echo $RECORDS|grep -q '"'$RR'"'; then
    if echo $RECORDS|grep -q '"'$IP'"'; then
        echo "$DOMAIN_NAME $IP"
        echo "The DNS record already exists."
        exit 1
    fi
    RECORD=`echo $RECORDS|sed 's/{"RR":"/\n\r{"RR":"/g'|sed 's/]},"PageNumber"/\n\r]},"PageNumber"/g'|grep '"'$RR'"'`
    RECORD=${RECORD#*'"RecordId":"'}
    RECORD_ID=${RECORD%'","TTL"'*}
    RESULT=`UpdateDomainRecord $RECORD_ID`
    if echo $RESULT|grep -q 'RecordId'; then
        echo "$DOMAIN_NAME $IP"
        echo "Add DNS record success."
    else
        echo "$DOMAIN_NAME $IP"
        echo "Add DNS record fail."
    fi
else
    AddDomainRecord
fi
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用shell实现阿里云动态DNS 的相关文章

  • sh autolog backup

    shell sh 每天备份log文件 bin bash 每天备份log文件 log path 61 34 home fdipzone logs 34 log目录 backup path 61 34 home fdipzone logs ba
  • Apache rewrite

    1 开启rewrite sudo a2enmod rewrite 2 停用rewrite sudo a2dismod rewrite 3 服务器环境变量 Apache提供给rewirte模块的环境变量大概分成5个类型 第一部分 HTTP h
  • RewriteCond和13个mod_rewrite应用举例Apache伪静态

    1 xff0e 给子域名加www标记 RewriteCond HTTP HOST a z 43 example com NC RewriteCond HTTP HOST www NC RewriteRule http www xample
  • 正向代理与反向代理的区别

    正向代理的概念 正向代理 也就是传说中的代理 他的工作原理就像一个跳板 简单的说 我是一个用户 我访问不了某网站 但是我能访问一个代理服务器 这个代理服务器呢 他能访问那个我不能访问的网站 于是我先连上代理服务器 告诉他我需要那个无法访问网
  • Apache 搭建虚拟主机

    Apache 搭建虚拟主机方法 DocumentRoot xff1a home fdipzone sites demo fdipzone com ServerName xff1a demo fdipzone com 1 进入apache虚拟
  • sh memcached 进程启动及监控

    memcached 进程启动及监控 1 memcached inc sh 设置路径 xff0c 端口等讯息 bin sh config include HOST 61 hostname SITE 61 34 mysite 34 PORT 6
  • 设置进程的显示名称

    有时候在LINUX下 xff0c fork子进程的时候 xff0c 像nginx里的一样 xff0c 想让子进程的名字可以自定义 参考网上文章之后 xff0c 可以通过修改argv 0 的值来改变子进程的名字 xff0c 但是要注意新标题的
  • 自动登入google play下载app report

    流程 1 登入google play 登入google play需要三步 https play google com apps publish https accounts google com ServiceLogin hl 61 en
  • sh cssupdate 优化

    bin bash 更新css文件内图片的版本 如background url 39 images test jpg 39 更新为 background url 39 images test jpg 20130330121210 39 css
  • php click captcha 验证码类

    需求 xff1a 现在常用的表单验证码大部分都是要用户输入为主 xff0c 但这样对手机用户会不方便 如果手机用户访问 xff0c 可以不用输入 xff0c 而是click某一位置便可确认验证码 xff0c 这样就会方便很多 原理 xff1
  • 快速排序算法

    快速排序 xff1a 代码 xff1a lt php 快速排序算法 1 在数组中找一个元素作为key 一般取数组第一个元素作为key 2 i 61 0 j 61 数组长度 1 3 j 当 arr j lt key arr i 与arr j
  • 利用Apache mod_expires 与 mod_headers 实现文件缓存及mod_deflate压缩输出

    1 使用mod deflate module 压缩输出 启动gzip 开启mod deflate sudo a2enmod deflate sudo etc init d apache2 restart 在httpd conf中添加 lt
  • HTML5 history API 介绍

    HTML5 history API介绍 history是个全局变量 xff0c 即window history 属性和方法如下 xff1a length xff1a 历史堆栈中的记录数 back xff1a 返回上一页 foward xff
  • 冒泡,二分法插入,快速排序算法

    1 冒泡排序算法 过程 xff1a 1 遍历整个数组 xff0c 每两两相邻的元素进行比较 xff0c 如 a i gt a i 43 1 则互换位置 xff0c 每次比较消除一个逆序 2 每一次循环后 xff0c 下次再需要循环的次数减少
  • PHP缩小png图片,保留透明色方法

    将图片缩成合适的尺寸 xff0c jpg图片缩小比较容易 xff0c png图片如果带了透明色 xff0c 按jpg方式来缩小 xff0c 会造成透明色丢失 保存透明色主要利用gd库的两个方法 xff1a imagecolorallocat
  • Ubuntu的常用快捷键

    Ubuntu Gnome的桌面技巧 xff1a 61 61 61 键盘类 61 61 61 1 先同时按住 Alt 43 Ctrl 键 xff0c 再按键盘上的左 右光标 键 可以切换工作区 2 web时按 键 等于 查找功能 桌面或者目录
  • 无人驾驶虚拟仿真(四)--通过ROS系统控制小车行走

    简介 xff1a 实现键盘控制虚拟仿真小车移动 xff0c w s a d 空格 xff0c 对应向前 向后 向左 向右 急停切换功能 xff0c q键退出 1 创建key control节点 进入工作空间源码目录 xff1a cd myr
  • error while loading shared libraries的解決方法

    error while loading shared libraries的解決方法 运行程式時 xff0c 如遇到像下列這種錯誤 xff1a tests error while loading shared libraries xxx so
  • imagemagick安装方法

    1 下载ImageMagick http www imagemagick org download 下载 ImageMagick 6 8 5 10 tar gz xff0c 下载完毕后开始进行安装 cd Downloads tar xzvf
  • ubuntu中安装apache ab命令进行简单压力测试

    1 安裝ab命令 sudo apt get install apache2 utils 2 ab命令参数说明 Usage ab options http s hostname port path Options are 总的请求数 n re

随机推荐

  • 如何查看当前Apache的连接数

    查看了连接数和当前的连接数 netstat ant grep ip 80 wc l netstat ant grep ip 80 grep EST wc l 查看IP访问次数 netstat nat grep 34 80 34 awk 39
  • php 获取页面中的指定内容类

    功能 xff1a 1 获取内容中的url xff0c email xff0c image 2 替换内容中的url xff0c email xff0c image url xff1a lt a href 61 34 url 34 gt xxx
  • memcached启动参数

    memcached启动参数 p 指定端口号 xff08 默认11211 xff09 U lt num gt UDP监听端口 默认 11211 0 时关闭 s lt file gt 用于监听的UNIX套接字路径 xff08 禁用网络支持 xf
  • mysql常用方法

    1 CONCAT str1 str2 mysql gt SELECT CONCAT 39 My 39 39 S 39 39 QL 39 gt 39 MySQL 39 mysql gt SELECT CONCAT 39 My 39 NULL
  • shell 监控网站是否异常的脚本

    shell 监控网站是否异常的脚本 xff0c 如有异常自动发电邮通知管理员 流程 xff1a 1 检查网站返回的http code 是否等于200 xff0c 如不是200视为异常 2 检查网站的访问时间 xff0c 超过MAXLOADT
  • 文件转base64输出

    Data URI scheme是在RFC2397中定义的 xff0c 目的是将一些小的数据 xff0c 直接嵌入到网页中 xff0c 从而不用再从外部文件载入 优点 xff1a 减少http连接数 缺点 xff1a 这种格式的文件不会被浏览
  • php 支持断点续传的文件下载类

    php 支持断点续传 xff0c 主要依靠HTTP协议中 header HTTP RANGE实现 HTTP断点续传原理 Http头 Range Content Range HTTP头中一般断点下载时才用到Range和Content Rang
  • 基于Linkit 7697的红绿灯控制系统

    1 硬件准备 LinkIt 7697 1 xff0c 继电器模块 1 xff0c 面包板 1 xff0c RGB LED灯 1 xff08 共阳极 xff0c 工作电流20mA xff0c 红灯压降2 2 2V xff0c 绿灯蓝灯压降3
  • shell 记录apache status并自动更新到数据库

    1 获取apache status monitor log sh bin bash 连接数 site connects 61 netstat ant grep ip 80 wc l 当前连接数 site cur connects 61 ne
  • php 缩略图生成类,支持imagemagick及gd库两种处理

    功能 1 按比例缩小 放大 2 填充背景色 3 按区域裁剪 4 添加水印 包括水印的位置 透明度等 使用imagemagick GD库实现 imagemagick地址 www imagemagick org 需要安装imagemagick
  • php5.3 中显示Deprecated: Assigning the return value of new by reference is deprecated in 的解决方法

    今天需要将某个网站般去另一台服务器 设置好运行 xff0c 显示一大堆Deprecated Deprecated Assigning the return value of new by reference is deprecated in
  • 使用apache mod_env模块保存php程序敏感信息

    Apache模块 mod env 说明 xff1a 允许Apache修改或清除传送到CGI脚本和SSI页面的环境变量 模块名 xff1a env module 源文件 xff1a mod env c 本模块用于控制传送给CGI脚本和SSI页
  • php 根据url自动生成缩略图

    原理 xff1a 设置apache rewrite xff0c 当图片不存在时 xff0c 调用php创建图片 例如 原图路径为 xff1a http localhost upload news 2013 07 21 1 jpg 缩略图路径
  • mailto 参数说明

    mailto 可以调用系统内置软件发送电子邮件 参数说明 mailto xff1a 收件人地址 xff0c 可多个 xff0c 用 分隔 cc xff1a 抄送人地址 xff0c 可多个 xff0c 用 分隔 bcc xff1a 密件抄送人
  • mysql 导入导出数据库

    mysql 导入导出数据库 1 导出数据 导出test 数据库 R 表示导出函数和存储过程 xff0c 加上使导出更完整 mysqldump u root p R test gt test sql 导出test数据库中user表 mysql
  • php 广告加载类

    php 广告加载类 xff0c 支持异步与同步加载 需要使用Jquery ADLoader class php lt php 广告加载管理类 Date 2013 08 04 Author fdipzone Ver 1 0 Func publ
  • 使用<img>标签加载php文件,记录页面访问讯息

    原理 xff1a 通过 lt img gt 标标签加载php文件 xff0c php文件会使用gd库生成一张1x1px的空白透明图片返回 xff0c 并记录传递的参数写入log文件 lt img src 61 34 sitestat php
  • tput 命令行使用说明

    什么是 tput xff1f tput 命令将通过 terminfo 数据库对您的终端会话进行初始化和操作 通过使用 tput xff0c 您可以更改几项终端功能 xff0c 如移动或更改光标 更改文本属性 xff0c 以及清除终端屏幕的特
  • ROS2学习笔记(二)-- 多机通讯原理简介及配置方法

    在ROS1中由主节点 master 负责其它从节点的通信 xff0c 在同一局域网内通过设置主节点地址也可以实现多机通讯 xff0c 但是这种多机通讯网络存在一个严重的问题 xff0c 那就是所有从节点强依赖于主节点 xff0c 一旦运行主
  • 使用shell实现阿里云动态DNS

    https github com timwai aliyunDDNS shell 脚本全部使用基础的命令实现 xff0c 支持在openwrt中使用 修改以下参数为你自己的参数 ACCESS KEY ID 61 你的AccessKeyId