文章目录

  • 前言
  • 申请AccessKey
    • 创建用户
    • 创建用户组
    • 用户组添加成员
    • 用户组添加权限
  • Shell脚本

前言

由于服务器的外网是动态拨号,每次获取的外网IP都不同。手头上刚好有阿里云的域名。为此,想通过编写一个Shell脚本,定期通过互联网服务获取当前机器所在网络的外部IP地址,并将新的IP地址通过阿里云提供的API,更新到对应的域名解析记录。

申请AccessKey

登陆阿里云官网,在控制台的右上角,将鼠标移动到头像上,会出现如下列表:

选择AccessKey管理,会弹出如下提示:

选择开始使用子用户AccessKey,这里不选择继续使用AccessKey,原因是当前进入的页面是主账号,拥有所有的权限,建议通过使用子账户来配置,控制权限。

创建用户


填写要创建的登陆名称和显示名称,这里可以按照需要进行填写,然后点击确定完成创建用户。如果弹出要验证短信,则按提示完成即可。

创建完成后,默认账户没有AccessKey IDAccessKey Secret
选择左侧用户列表,点击新创建的用户名,出现如下设置:

选择创建AccessKey

保存创建好的AccessKey IDAccessKey Secret,注意AccessKey Secret只会在这一次显示,后续无法在此查看。如果忘记了,只能删除掉重新添加新的。

创建用户组

点击用户组,选择创建用户组,并填写用户组的相关信息。

点击确定,创建用户组。

用户组添加成员


在用户组后面选择添加组成员

选择要添加的用户进行添加,然后点击确定

用户组添加权限


在用户组后面选择添加权限

点击确定,添加权限。

到这里,子账户的创建及权限配置就已经完成。

Shell脚本

#!/bin/bash
echo "[$(date "+%G/%m/%d %H:%M:%S")] AliDDNS.sh start..."while true
do# 设置需要DDNS的地址,格式为 AliDDNS_SubDomainName.AliDDNS_DomainName ,
# 例如 AliDDNS_DomainName 为 example.com, AliDDNS_SubDomainName 为 ddns ,
# 连接起来就是 ddns.example.com
#
# 设置需要DDNS的域名 <DomainName>
AliDDNS_DomainName=""
# 设置需要DDNS的子域名 <SubDomainName>
AliDDNS_SubDomainName=""
# 设置域名记录的TTL (生存周期)
# 免费版产品最低为600(10分钟)~86400(1天), 付费版(企业版)包括以上范围, 还可以按照购买产品配置设置为:
# 600(10分钟)、120(2分钟)、60(1分钟)、10(10秒)、5(5秒)、1(1秒),
# 请按照自己的产品配置和DDNS解析速度需求妥善配置TTL值, 免费版设置低于600的TTL将会报错。
AliDDNS_TTL="600"# 设置阿里云的AccessKeyId/AccessKeySecret,
# 可在 https://ak-console.aliyun.com/ 处获取 ,
# 推荐使用 https://ram.console.aliyun.com/#/user/list 生成的AK/SK, 更安全
#
# 设置阿里云的Access Key
AliDDNS_AK=""
# 设置阿里云的Secret Key
AliDDNS_SK=""# 设置获取本机IP需要执行的命令 (用于nslookup命令获取DDNS域名的当前IP)
AliDDNS_LocalIP="curl -s whatismyip.akamai.com"
# 设置解析使用的DNS服务器 (推荐使用 223.5.5.5/223.6.6.6 , 毕竟都是阿里家的东西)
AliDDNS_DomainServerIP="223.5.5.5"# 防止用户忘记设置参数导致程序报错,部分参数如果检测到空值,自动使用默认值
[ "$AliDDNS_LocalIP" = "" ] && AliDDNS_LocalIP="curl -s whatismyip.akamai.com"
[ "$AliDDNS_DomainServerIP" = "" ] && $AliDDNS_DomainServerIP="223.5.5.5"
[ "$AliDDNS_TTL" = "" ] && AliDDNS_TTL="600"
# 获取本机公网IP
AliDDNS_LocalIP=`$AliDDNS_LocalIP 2>&1` || die "$AliDDNS_LocalIP"
# 获取DDNS域名当前解析记录IP
AliDDNS_DomainIP=`nslookup $AliDDNS_SubDomainName.$AliDDNS_DomainName $AliDDNS_DomainServerIP 2>&1`
# 判断上一条命令的执行是否成功
if [ "$?" -eq "0" ]
then# 如果执行成功,分离出结果中的IP地址AliDDNS_DomainIP=`echo "$AliDDNS_DomainIP" | grep 'Address:' | tail -n1 | awk '{print $NF}'`# 进行判断,如果本次获取的新IP和旧IP相同,则进行休眠一分钟后再继续判断if [ "$AliDDNS_LocalIP" = "$AliDDNS_DomainIP" ]thenecho "[$(date "+%G/%m/%d %H:%M:%S")] Local IP ($AliDDNS_LocalIP) is the same with Domain IP ($AliDDNS_DomainIP)"echo "[$(date "+%G/%m/%d %H:%M:%S")] No change modified ..."sleep 60continuefi
fi
# 如果IP发生变动,开始进行修改
# 生成时间戳
timestamp=`date -u "+%Y-%m-%dT%H%%3A%M%%3A%SZ"`
# URL加密函数
urlencode() {# urlencode <string>out=""while read -n1 cdocase $c in[a-zA-Z0-9._-]) out="$out$c" ;;*) out="$out`printf '%%%02X' "'$c"`" ;;esacdoneecho -n $out
}
# URL加密命令
enc() {echo -n "$1" | urlencode
}
# 发送请求函数
send_request() {local args="AccessKeyId=$AliDDNS_AK&Action=$1&Format=json&$2&Version=2015-01-09"local hash=$(echo -n "GET&%2F&$(enc "$args")" | openssl dgst -sha1 -hmac "$AliDDNS_SK&" -binary | openssl base64)curl -s "http://alidns.aliyuncs.com/?$args&Signature=$(enc "$hash")"
}
# 获取记录值 (RecordID)
get_recordid() {grep -Eo '"RecordId":"[0-9]+"' | cut -d':' -f2 | tr -d '"'
}
# 请求记录值 (RecordID)
query_recordid() {send_request "DescribeSubDomainRecords" "SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&SubDomain=$AliDDNS_SubDomainName.$AliDDNS_DomainName&Timestamp=$timestamp"
}
# 更新记录值 (RecordID)
update_record() {send_request "UpdateDomainRecord" "RR=$AliDDNS_SubDomainName&RecordId=$1&SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&TTL=$AliDDNS_TTL&Timestamp=$timestamp&Type=A&Value=$AliDDNS_LocalIP"
}
# 添加记录值 (RecordID)
add_record() {send_request "AddDomainRecord&DomainName=$AliDDNS_DomainName" "RR=$AliDDNS_SubDomainName&SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&TTL=$AliDDNS_TTL&Timestamp=$timestamp&Type=A&Value=$AliDDNS_LocalIP"
}# 判断RecordIP是否为空
if [ "$AliDDNS_RecordID" = "" ]
thenAliDDNS_RecordID=`query_recordid | get_recordid`
fi
if [ "$AliDDNS_RecordID" = "" ]
thenAliDDNS_RecordID=`add_record | get_recordid`echo "[$(date "+%G/%m/%d %H:%M:%S")] Added RecordID : $AliDDNS_RecordID"
elseupdate_record $AliDDNS_RecordIDecho "[$(date "+%G/%m/%d %H:%M:%S")] Updated RecordID : $AliDDNS_RecordID"
fi# 输出最终结果
if [ "$AliDDNS_RecordID" = "" ]; then# 输出失败结果 (因为没有获取到RecordID)echo "[$(date "+%G/%m/%d %H:%M:%S")] DDNS Update Failed !"
else# 输出成功结果echo "[$(date "+%G/%m/%d %H:%M:%S")] DDNS Update Success, New IP is : $AliDDNS_LocalIP"
fisleep 30
done

填入要管理的域名和对应的子域名,并将上一步获得的AccessKey IDAccessKey Secret填入。运行脚本即可定时检测当前外网IP,并更新到对应的子域名记录里面。

Shell脚本调用阿里云API实现DDNS动态域名解析相关推荐

  1. Python+阿里云DNS 搭建DDNS动态域名解析

    家用的动态公网IP在断电以及一段时间后会变化,现在家宽公网IP开网盘以及代理管得越来越严格,已经有检测到被封的案例 上海检测web封停 这让我这种挂种子的PT党(迫真)感到害怕 以前我把国外的免费域名 ...

  2. 【Linux学习】如何编写Shell脚本调用企业微信api来发消息给企业微信成员?

    一.前言 最近通过python实现了发送消息给企业微信的功能,参考链接: [Jenkins学习 ]如何编写Python脚本来调用企业微信的api通知企业微信成员关于Jenkins的编译结果? http ...

  3. 调用阿里云API实现证件照生成

    目录 1. 作者介绍 2. 算法介绍 2.1 阿里云介绍 2.2 证件照生成背景 2.3 图像分割算法 3.调用阿里云API进行证件照生成实例 3.1 准备工作 3.2 实验代码 3.3 实验结果与分 ...

  4. 实现调用阿里云API第二章——API调用实战(全球IP地址归属地查询)

    本篇将实现利用springboot实现阿里云API调用实战. 一.购买阿里云API https://market.aliyun.com/data?spm=5176.9502607.1387859.3. ...

  5. java调用阿里云api发送短信验证服务

    1.先在maven构建需要的jar包 <dependency><groupId>com.aliyun</groupId><artifactId>aliy ...

  6. 【Python】垃圾分类,调用阿里云API

    垃圾分类 # -*- coding: UTF-8 -*- # !/usr/local/bin/python3# 阿里云服务第三方公司服务 # 可用于检测垃圾的种类,返回结果是金属的概率,塑料的概率,玻 ...

  7. python账单查询软件_python3.6 通过调用 阿里云 API (非SDK方式) 查询 账单 例子

    特别注意: 报错: b'{"Recommend":"https://error-center.aliyun.com/status/search?Keyword=Missi ...

  8. 用阿里云 DNS SDK 实现动态域名解析

    最近学 Java ,就将 Git 服,和测试服,直接放在家里的树莓派3和旧笔记本上, 为了在外网顺利访问,需要将域名动态的解析到家里的 IP 上, 网上了解了一番,觉得阿里云那套通过 sdk 来更新域 ...

  9. 实现调用阿里云API第一章——API请求与认证

    一.客户端请求包含的内容 1.URL(API调用地址) 2.请求方式 3.Headers(请求头) 4.Body(请求主体) 二.API请求的方式 GET:请求服务器获取一个资源 POST:请求服务器 ...

  10. api调用实例python_调用阿里云API 的demo示例(java/python)

    Java 示例 // 创建DefaultAcsClient实例并初始化 DefaultProfile profile = DefaultProfile.getProfile(vo.getAliRegi ...

最新文章

  1. python画熊猫代码_用Python Turtle 画可爱的熊猫
  2. CVPR 2020: 移动端机器学习的研究实现
  3. Android开发人员官方站点文档 - 国内踏得网镜像
  4. python读取数据文件-python多种读写excel等数据文件的方式(收藏篇)
  5. python算法与数据结构-数据结构中常用树的介绍
  6. 得胜php100怎么样,优缺点评测得胜Q麦评价如何?怎么样呢?老司机透漏
  7. 老的消息中间件投递失败的类型值_RabbitMQ消息中间件技术精讲11 高级篇四 confirm 确认消息...
  8. [deviceone开发]-do_SlideListView的简单示例
  9. 4.11 一维到三维推广
  10. CSS3背景图片百分比及应用
  11. 读取文件卡顿_CPU占用100%,电脑卡顿原来可以这样解决!多任务操作也运行如飞...
  12. 数据绑定表达式语法(Eval,Bind区别)
  13. 算法_栈的Java的通用数组实现
  14. 下列哪个滤波器是非线性的_上海海事数字信号处理2006试卷A参考答案
  15. 触动精灵游戏脚本制作
  16. 华为OD机试(JAVA)真题II
  17. VINS-Mono 代码解析——视觉跟踪 feature_trackers
  18. 2048游戏规则及玩法技巧攻略
  19. 《SolidWorks 2014中文版机械设计从入门到精通》——2.2 草图命令
  20. USART与UART的区别,单工,半双工和全双工的区别

热门文章

  1. UVALive 6437 Power Plant 【最小生成树 + 思维】
  2. python判断ip是否可以ping通
  3. ognl以及令牌以及开头的一点方法
  4. Python list列表查找元素
  5. 铁矿石再次冲高回落,豆粕认购大涨,纯碱09-01季节性反套?2022.4.21
  6. 禁用win10触摸屏手势_笔记本WIN10系统启用或关闭触控板的多指(多点)触控功能步骤...
  7. LaTeX里插入数学公式
  8. python怎样定义数组_终于知道python如何定义二维数组
  9. 全国最佳医院排名,为家人留一份
  10. 《高效人士的七个习惯》读后感-总结