#!/bin/bash
set -e#================================================================================================================#
# 功能:用于更新阿里云域名IP,实现DDNS功能
#
# 在 http://www.gebi1.com/forum.php?mod=viewthread&tid=287344&page=1&_dsign=8f94f74c 提供的脚本文件基础上修改的。
# ghui, modified 12/2/2019
# 在 N1 debian Buster with Armbian Linux 5.3.0-aml-g12 手动执行/定时任务(crontab)执行测试通过
#================================================================================================================#
#
# 使用方法:
#
# 方法1. 外部参数
# 修改源码,将对应参数 修改为$1,$2,$3,$4,$5,$6
# aliddns.sh <aliddns_ak> <aliddns_sk> <aliddns_subdomain> <aliddns_domain> <aliddns_iptype> <aliddns_ttl>
# 示例(A 代表 IPv4,AAAA 代表 IPv6):
# 执行:aliddns.sh "xxxx" "xxx" "test" "mydomain.site" "A" 600
# 执行:aliddns.sh "xxxx" "xxx" "test" "mydomain.site" "AAAA" 600
#
# 方法2. 内部参数
# 修改源码,将$1,$2,$3,$4,$5,$6 替换为对应参数
#
# 示例:
# aliddns_ak="xxxx"
# aliddns_sk="xxx"
# aliddns_subdomain="test"
# aliddns_domain="mydomain.site"
# aliddns_iptype="A"
# aliddns_ttl=600
# 执行:aliddns.sh
#
#================================================================================================================##--------------------------------------------------------------
# 参数
#
# (*)阿里云 AccessKeyId
aliddns_ak=xxx
# (*)阿里云 AccessKeySecret
aliddns_sk=xxx# (*)域名:test.mydomain.com
aliddns_subdomain=test #'test'
aliddns_domain=xxx.com #'mydomain.com'# (*)ip地址类型:'A' 或 'AAAA',代表ipv4 和 ipv6
aliddns_iptype=A # 'A' 或 'AAAA',代表ipv4 和 ipv6# TTL 默认10分钟 = 600秒
aliddns_ttl=600 #"600"#--------------------------------------------------------------machine_ip=""
ddns_ip=""
aliddns_record_id=""if [ "$aliddns_subdomain" = "@" ]
thenaliddns_name=$aliddns_domain
elsealiddns_name=$aliddns_subdomain.$aliddns_domain
finow=`date`
echo "**************************************************"
echo "$now"
echo "$aliddns_name"function getMachine_IPv4() {echo $(/usr/bin/wget -qO- -t1 -T2 http://ip.3322.net)
}function getMachine_IPv6() {ipv6=`ip addr | grep "inet6.*global" | grep -v "deprecated" | awk '{print $2}' | awk -F"/" '{print $1}' | sed -n '1,1p'`echo $ipv6
}function getDDNS_IP() {current_ip=`nslookup -query=$aliddns_iptype $aliddns_name | grep "Address" | grep -v "#53" | awk '{print $2}'`echo $current_ip
}function 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
}function enc() {echo -n "$1" | urlencode
}function 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")"
}function get_recordid() {grep -Eo '"RecordId":"[0-9]+"' | cut -d':' -f2 | tr -d '"'
}function query_recordid() {send_request "DescribeSubDomainRecords" "SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&SubDomain=$aliddns_name&Timestamp=$timestamp&Type=$aliddns_iptype"
}function update_record() {send_request "UpdateDomainRecord" "RR=$aliddns_subdomain&RecordId=$1&SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&TTL=$aliddns_ttl&Timestamp=$timestamp&Type=$aliddns_iptype&Value=$(enc $machine_ip)"
}function add_record() {send_request "AddDomainRecord&DomainName=$aliddns_domain" "RR=$aliddns_subdomain&SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&TTL=$aliddns_ttl&Timestamp=$timestamp&Type=$aliddns_iptype&Value=$(enc $machine_ip)"
}if [ "$aliddns_iptype" = 'A' ]
thenecho "ddns is IPv4."machine_ip=`echo "$(getMachine_IPv4)"`echo "machine_ip = $machine_ip"aliddns_record_id=$aliddnsipv4_record_id
elseecho "ddns is IPv6."machine_ip=`echo "$(getMachine_IPv6)"`echo "machine_ip = $machine_ip"aliddns_record_id=$aliddnsipv6_record_id
fiddns_ip=`echo "$(getDDNS_IP)"`
echo "ddns_ip = $ddns_ip"if [ "$machine_ip" = "" ]
thenecho "machine_ip is empty!"exit 0
fiif [ "$machine_ip" = "$ddns_ip" ]
thenecho "skipping\n"exit 1
fiecho "start update..."timestamp=`date -u "+%Y-%m-%dT%H%%3A%M%%3A%SZ"`if [ "$aliddns_record_id" = "" ]
thenaliddns_record_id=`query_recordid | get_recordid`echo "----------------" $aliddns_record_id "\n"if [ "$aliddns_iptype" = 'A' ]thenaliddnsipv4_record_id=$aliddns_record_idelsealiddnsipv6_record_id=$aliddns_record_idfi
fi#add support */%2A and @/%40 record
if [ "$aliddns_record_id" = "" ]
thenecho "add record starting"aliddns_record_id=`add_record | get_recordid`if [ "$aliddns_record_id" = "" ]thenecho "aliddns_record_id is empty. \n"elseif [ "$aliddns_iptype" = 'A' ]thenaliddnsipv4_record_id=$aliddns_record_idelsealiddnsipv6_record_id=$aliddns_record_idfiecho "added record $aliddns_record_id \n"fi
elseecho "update record starting"update_record $aliddns_record_idecho "updated record $aliddns_record_id \n"
fi

Shell 脚本:DDNS for aliyun相关推荐

  1. Linux环境Shell脚本上传下载阿里云OSS文件

    为什么80%的码农都做不了架构师?>>>    Linux环境Shell脚本上传下载阿里云OSS文件 背景 工作中由于我们项目生成的日志文件比较重要,而本地磁盘空间有限存储不了多久, ...

  2. MySQL【付诸实践 01】Linux 环境 MySQL 数据库备份 shell 脚本(脚本源码及说明+定时任务配置+数据库恢复测试)粘贴可以

    数据库备份的重要性不言而喻,备份的方法主要分为两大类,一是文件备份,二是数据库本身的备份机制binlog日志,今天先说说文件备份,就是将数据库[结构和数据]导出为文件. 1.备份脚本 在 /data/ ...

  3. 给运维工程师的Cheatsheets! 《Shell脚本速查手册》免费下!

    简介:Shell 作为 Linux 中的第一语言,几乎每一个使用 Linux 的人都用到或用过 Shell,但绝大多数人都并不能掌握 Shell 编程的基本能力和技巧. 2021 年,阿里云开发者学堂 ...

  4. 怎么通过java去调用并执行shell脚本以及问题总结

    原文 https://blog.satikey.com/p/5759/how-java-calls-and-executes-shell-scripts-and-summary.html 主题 She ...

  5. tar ,cpio打包解压. shell脚本for,while,until循环. rpm包管理,select循环菜单,函数function,yum...

    tar  tar -cf 路径+文件名字后续.tar  +路径 创建归档压缩 tar cf /testdir/etc.tar /etc/ tar cvf 可以查看解压过程 tar tvf 预览作用 t ...

  6. shell脚本——一键完成虚拟机初始化

    新装的虚拟机总是没有vim,没有wget,使用起来特别的不方便,因此,我自己写了一个shell脚本,用来初始化虚拟机,亲测简单有效 #!/usr/bin/env bash # #Author:camp ...

  7. shell脚本自动化创建虚拟机的基本配置--tomcat--mysql--jdk--maven---妈妈再也不用担心我不会配置虚拟机了!

    文章目录 自动化shell脚本 一:虚拟机初始化 二:jdk自动化安装 三:maven自动化安装 四:tomcat自动化安装 五:mysql自动化安装 自动化shell脚本 ps:此处安装的jdk,m ...

  8. 编写一个shell脚本,使其能够备份/etc目录下所有文件,并且备份的文件名需要自动生成日期,即产生后缀名形如.backup_20210624的文件。

    一.实现过程: 目录 一.实现过程: 二.验证结果: 1.在当前目录下,使用vi或者touch命令新建一个shell脚本文件,并且使用chmod命令添加权限(我这里添加的是最高权限),如图: 2.使用 ...

  9. Shell脚本详解---一篇搞定

    有道云分享链接 1.1 前言 1.1.1 为什么学Shell Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, Linux/UNIX系统的底层及基础应用软件的核心大都 ...

  10. linux命令行和shell脚本编程大全笔记

    第1章        初识Linux shell 内存存储单元按组划分成很多块,这些块称作页面(page) Linux操作系统将运行中的程序称为进程.进程可以在前台运行,将输出显示在屏幕上,也 可以在 ...

最新文章

  1. 协议地址结构_通信之路——用最简洁的文字告诉你互联网协议TCP/IP
  2. gitlab上传文件到group_gitlab恢复备份数据
  3. 张俊红数据分析知识体系(持续更新中......)
  4. BZOJ 1026 [SCOI2009]windy数
  5. 如何在 ASP.Net Core 中使用 Lamar
  6. linux virt java_Linux下Java环境安装
  7. 历时五天用 SwiftUI 做了一款 APP,阿里工程师如何做的?
  8. Can 总线 收发原理
  9. php 递归求得目录大小
  10. 老李说事:性能测试服务日记
  11. 【Docker】常用命令简述十一
  12. js代码错误监控代码
  13. mysql备份的 三种方式
  14. 安装SQL Server 2012 报错“启用windows功能NetFx3时出错”解决方法
  15. python大数据方向_大数据行业5个职位方向指南
  16. 朱晔的互联网架构实践心得S1E10:数据的权衡和折腾【系列完】
  17. snapchat 登录不上_如何在Snapchat上举报某人
  18. 全志定制编译Android,全志H3 Android定制化文档
  19. DRSL: Deep Relational Similarity Learning for Cross-modal Retrieval-多模态学习总结
  20. 不一样的厦门,不一样的旅行!

热门文章

  1. 按键精灵找文字的基础代码模板
  2. C语言实现英文句子单词提取并分离
  3. 《第二次曲线创新》李善友教授
  4. BCNF范式(修正的第三范式)、第四范式和第五范式
  5. C语言 分数加减运算
  6. 使用application对象实现网站访问量统计
  7. QT学习笔记(十五):QLabel的点击事件(clicked)添加
  8. 机器学习——sklearn实现决策树(隐形眼镜预测和鸢尾花分类)
  9. 手机里多个PDF合并成一个PDF的免费方法
  10. python图片转gif