阿里云手动更新dns解析
生活随笔
收集整理的這篇文章主要介紹了
阿里云手动更新dns解析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
腳本1
#!/bin/bash # alidns.sh #https://www.cnblogs.com/elvi/p/11663910.html #阿里云DNS api接口 shell 更改DNS解析############################## which dig &>/dev/null || { yum install -y bind-utils ; } || { echo "need to install dig";exit 1; }##配置 host="openvpn" #主機名 domain="tianqixuda.com" #域名 ak="XXXXXXXXX" #阿里云AccessKey ID sk="XXXXXXXXXXXXX&" #阿里云Access Key Secret 后面多個 & timestamp=`date -u +"%Y-%m-%dT%H:%M:%SZ"`############################## #hash簽名使用 urlencode1() {local length="${#1}"i=0out=""for i in $(awk "BEGIN { for ( i=0; i<$length; i++ ) { print i; } }")dolocal c="${1:$i:1}"case $c in[a-zA-Z0-9.~'&'=_-]) out="$out$c" ;;*) out="$out`printf '%%%02X' "'$c"`" ;;esaci=$(($i + 1))doneecho -n $out } urlencode2() {local length="${#1}"i=0out=""for i in $(awk "BEGIN { for ( i=0; i<$length; i++ ) { print i; } }")dolocal c="${1:$i:1}"case $c in[a-zA-Z0-9.~_-]) out="$out$c" ;;*) out="$out`printf '%%%02X' "'$c"`" ;;esaci=$(($i + 1))doneecho -n $out }############################## #函數send_request() { args="AccessKeyId=$ak&Action=$1&Format=json&$2&Version=2015-01-09" StringToSign1="$(urlencode1 $args)" StringToSign2="GET&%2F&$(urlencode2 $StringToSign1)" hash=$(urlencode2 $(echo -n "$StringToSign2" | openssl dgst -sha1 -hmac $sk -binary | openssl base64)) RESULT=$(curl -k -s "https://alidns.aliyuncs.com/?$args&Signature=$hash") ## 2> /dev/null) echo $RESULT } query_recordid() {if [ "$host" = "@" ]; then echo `send_request "DescribeSubDomainRecords" "SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&SubDomain=$domain&Timestamp=$timestamp"`else echo `send_request "DescribeSubDomainRecords" "SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&SubDomain=$host.$domain&Timestamp=$timestamp"`fi } update_record() {echo `send_request "UpdateDomainRecord" "RR=$host&RecordId=$1&SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&Timestamp=$timestamp&Type=A&Value=$ip"` } add_record() {echo `send_request "AddDomainRecord&DomainName=$domain" "RR=$host&SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&Timestamp=$timestamp&Type=A&Value=$ip"` }add_host() { #echo "新增解析" RESULT=`add_record` record_id=$(echo $RESULT | grep -o "RecordId\":\"[0-9]*\"" | grep -o "[0-9]*") [ "$record_id" = "" ] && { echo "$host.$domain $ip AddError";exit 1; } echo "$host.$domain $ip AddHost $(date +'%F %T')" }up_host() { #echo "更新解析" #查詢RecordId RESULT=`query_recordid` record_id=$(echo $RESULT | grep -o "RecordId\":\"[0-9]*" | grep -o "[0-9]*") [ "$record_id" = "" ] && { echo "get record_id error";exit 1; } #更新 RESULT=`update_record $record_id` record_id=$(echo $RESULT | grep -o "RecordId\":\"[0-9]*\"" | grep -o "[0-9]*") [ "$record_id" = "" ] && { echo "$host.$domain $ip UpError";exit 1; } echo "$host.$domain $ip UpHost $(date +'%F %T')" }############################## #獲取本地外網ip并更新dns#ip UA="Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 6.3; blog.elven.vip)" ip=$(curl -s -A "$UA" http://ipv4.icanhazip.com) ip_dns=$(dig @dns23.hichina.com ${host}.${domain} A +short) # echo ip $ip # echo ip_dns $ip_dns # [ -n "$ip" ] || { echo "ip error"; }if [ -n "$ip_dns" -a "$ip_dns" = "$ip" ];thenecho "$host.$domain $ip_dns" elif [ "$ip_dns" = "" ];thenadd_host elseup_host fi############################## #傳參 主機 域名 ipalidns() { # var: host domain ip host="$1" domain=$2 ip=$3 ip_dns=$(dig @dns23.hichina.com ${host}.${domain} A +short)if [ $# -eq 2 ];thenif [ -n "$ip_dns" ];thenecho "$host.$domain $ip_dns"elseecho "$host.$domain no found"fi elif [ $# -eq 3 ];thenif [ "$ip" = "$ip_dns" ];thenecho "$host.$domain $ip_dns"else[ `echo $ip |grep -oE '[0-9]{0,3}\.[0-9]{0,3}\.[0-9]{0,3}\.[0-9]{0,3}' |wc -l` -eq 0 ] && { echo "ip $ip error";exit 1; }[ "$ip_dns" = "" ] && { add_host ; } || { up_host ; }fi elseecho "eg:$0 www abc.com 192.168.18.18" fi }alidns "$@"# 使用實例 增加或更新 *.abc.elven.vip ,通配符使用'' # bash alidns.sh '*.abc' elven.vip 192.168.18.18 ############################## # api https://help.aliyun.com/knowledge_detail/39863.html ##############################腳本二
#!/bin/bash# 更新日志 # Update 20180914 : # [Fix] 再次修復: CPU 100%占用問題 # 這次找到了AliDDNS卡100%死循環的原因,并且加了一個小的檢測機制,理論上應該不會再出現 # CPU卡100%的問題了(如果有問題請私信腳本作者,謝謝!)BuildTime="20180914"# 專家模式開關 # 注意: 只有當你了解整個AliDDNS工作流程,并且有一定的動手能力,希望對AliDDNS腳本的更多參數進行 # 深度定制時,你可以打開這個開關,會提供更多可以設置的選項,但如果你不懂、超級小白,請不要 # 打開這個開關!因打開專家模式后配置失誤發生的問題,作者不負任何責任! # 如需打開專家模式,請將腳本文件中的 Switch_AliDDNS_ExpertMode 變量值設置為1,即可打開 # 專家模式,如需關閉,請將此值設置為0! Switch_AliDDNS_ExpertMode="0" echo " " echo `date` # =================================================================================== # # 下面的代碼均為程序的核心代碼,請不要觸動任何地方的代碼,直接運行腳本即可使用! # # ===================================================================================# Shell環境初始化 # 字體顏色定義 Font_Black="\033[30m" Font_Red="\033[31m" Font_Green="\033[32m" Font_Yellow="\033[33m" Font_Blue="\033[34m" Font_Purple="\033[35m" Font_SkyBlue="\033[36m" Font_White="\033[37m" Font_Suffix="\033[0m" # 消息提示定義 Msg_Info="${Font_Blue}[Info] ${Font_Suffix}" Msg_Warning="${Font_Yellow}[Warning] ${Font_Suffix}" Msg_Error="${Font_Red}[Error] ${Font_Suffix}" Msg_Success="${Font_Green}[Success] ${Font_Suffix}" Msg_Fail="${Font_Red}[Failed] ${Font_Suffix}" # Shell變量開關初始化 Switch_env_is_root="0" Switch_env_curl_exist="0" Switch_env_openssl_exist="0" Switch_env_nslookup_exist="0" Switch_env_sudo_exist="0" Switch_env_system_release="none" # AliDDNS組件-變量初始化 AliDDNS_DomainName="" AliDDNS_SubDomainName="" AliDDNS_TTL="" AliDDNS_AK="" AliDDNS_SK="" AliDDNS_LocalIP="" AliDDNS_DomainServerIP="" # ServerChan組件-變量初始化 Switch_ServerChan_Enable="0" ServerChan_SCKEY="" ServerChan_Text="" ServerChan_Content=""# Shell腳本信息顯示 #echo -e "${Font_Green} #========================================================= # AliDDNS 工具 (阿里云云解析修改工具) # # Build: ${BuildTime} # 支持平臺: CentOS/Debian/Ubuntu # 作者: iLemonrain (原作者: kyriosli/koolshare-aliddns) # Blog: https://blog.ilemonrain.com # E-mail: ilemonrain@ilemonrain.com #========================================================#${Font_suffix}"# 檢查Root權限,并配置開關 function_Check_Root(){if [ "`id -u`" != "0" ]; thenSwitch_env_is_root="0"elseSwitch_env_is_root="1"fi }function_Check_Enviroment(){if [ -f "/usr/bin/curl" ]; thenSwitch_env_curl_exist="1"elseSwitch_env_curl_exist="0"fiif [ -f "/usr/bin/openssl" ]; thenSwitch_env_openssl_exist="1"elseSwitch_env_openssl_exist="0"fiif [ -f "/usr/bin/nslookup" ]; thenSwitch_env_nslookup_exist="1"elseSwitch_env_nslookup_exist="0"fiif [ -f "/usr/bin/sudo" ]; thenSwitch_env_sudo_exist="1"elseSwitch_env_sudo_exist="0"fiif [ -f "/etc/redhat-release" ]; thenSwitch_env_system_release="centos"elif [ -f "/etc/lsb-release" ]; thenSwitch_env_system_release="ubuntu"elif [ -f "/etc/debian_version" ]; thenSwitch_env_system_release="debian"elseSwitch_env_system_release="unknown"fi }function_Install_Enviroment(){if [ "${Switch_env_curl_exist}" = "0" ] || [ "${Switch_env_openssl_exist}" = "0" ] || [ "${Switch_env_nslookup_exist}" = "0" ]; thenecho -e "${Msg_Warning}未檢查到必需組件或者組件不完整,正在嘗試安裝……"if [ "${Switch_env_is_root}" = "1" ]; thenif [ "${Switch_env_system_release}" = "centos" ]; thenecho -e "${Msg_Info}檢測到系統分支:CentOS"echo -e "${Msg_Info}正在安裝必需組件……"yum install curl bind-utils openssl -yelif [ "${Switch_env_system_release}" = "ubuntu" ]; thenecho -e "${Msg_Info}檢測到系統分支:Ubuntu"echo -e "${Msg_Info}正在安裝必需組件……"apt-get install curl dnsutils openssl -yelif [ "${Switch_env_system_release}" = "debian" ]; thenecho -e "${Msg_Info}檢測到系統分支:Debian"echo -e "${Msg_Info}正在安裝必需組件……"apt-get install curl dnsutils openssl -yelseecho -e "${Msg_Warning}系統分支未知,取消環境安裝,建議手動安裝環境!"fiif [ -f "/usr/bin/curl" ]; thenSwitch_env_curl_exist="1"elseSwitch_env_curl_exist="0"echo -e "${Msg_Error}curl組件安裝失敗!可能會影響到程序運行!建議手動安裝!"fiif [ -f "/usr/bin/openssl" ]; thenSwitch_env_openssl_exist="1"elseSwitch_env_openssl_exist="0"echo -e "${Msg_Error}openssl組件安裝失敗!可能會影響到程序運行!建議手動安裝!"fiif [ -f "/usr/bin/nslookup" ]; thenSwitch_env_nslookup_exist="1"elseSwitch_env_nslookup_exist="0"echo -e "${Msg_Error}nslookup組件安裝失敗!可能會影響到程序運行!建議手動安裝!"fielif [ -f "/usr/bin/sudo" ]; thenecho -e "${Msg_Warning}檢測到當前腳本并非以root權限啟動,正在嘗試通過sudo命令安裝……"if [ "${Switch_env_system_release}" = "centos" ]; thenecho -e "${Msg_Info}檢測到系統分支:CentOS"echo -e "${Msg_Info}正在安裝必需組件 (使用sudo)……"sudo yum install curl bind-utils -yelif [ "${Switch_env_system_release}" = "ubuntu" ]; thenecho -e "${Msg_Info}檢測到系統分支:Ubuntu"echo -e "${Msg_Info}正在安裝必需組件 (使用sudo)……"sudo apt-get install curl dnsutils -yelif [ "${Switch_env_system_release}" = "debian" ]; thenecho -e "${Msg_Info}檢測到系統分支:Debian"echo -e "${Msg_Info}正在安裝必需組件 (使用sudo)……"sudo apt-get install curl dnsutils -yelseecho -e "${Msg_Warning}系統分支未知,取消環境安裝,建議手動安裝環境!"fielseecho -e "${Msg_Error}系統缺少必需環境,并且無法自動安裝,建議手動安裝!"fifi }# 判斷是否有已存在的配置文件 (是否已經配置過環境) function_AliDDNS_CheckConfig(){if [ -f "/etc/OneKeyAliDDNS/config.cfg" ]; thenecho -e "${Msg_Info}檢測到存在的配置,自動讀取現有配置\n 如果你不需要,請通過菜單中的清理環境選項進行清除"# 讀取配置文件AliDDNS_DomainName=`sed '/^AliDDNS_DomainName=/!d;s/.*=//' /etc/OneKeyAliDDNS/config.cfg | sed 's/\"//g'`AliDDNS_SubDomainName=`sed '/^AliDDNS_SubDomainName=/!d;s/.*=//' /etc/OneKeyAliDDNS/config.cfg | sed 's/\"//g'`AliDDNS_TTL=`sed '/^AliDDNS_TTL=/!d;s/.*=//' /etc/OneKeyAliDDNS/config.cfg | sed 's/\"//g'`AliDDNS_AK=`sed '/^AliDDNS_AK=/!d;s/.*=//' /etc/OneKeyAliDDNS/config.cfg | sed 's/\"//g'`AliDDNS_SK=`sed '/^AliDDNS_SK=/!d;s/.*=//' /etc/OneKeyAliDDNS/config.cfg | sed 's/\"//g'`AliDDNS_LocalIP=`sed '/^AliDDNS_LocalIP=/!d;s/.*=//' /etc/OneKeyAliDDNS/config.cfg | sed 's/\"//g'`AliDDNS_DomainServerIP=`sed '/^AliDDNS_DomainServerIP=/!d;s/.*=//' /etc/OneKeyAliDDNS/config.cfg | sed 's/\"//g'`if [ "${AliDDNS_DomainName}" = "" ] || [ "${AliDDNS_SubDomainName}" = 0 ] || [ "${AliDDNS_TTL}" = "" ] \|| [ "${AliDDNS_AK}" = "" ] || [ "${AliDDNS_SK}" = "" ] || [ "${AliDDNS_LocalIP}" = "" ] \|| [ "${AliDDNS_DomainServerIP}" = "" ]; thenecho -e "${Msg_Error}配置文件有誤,請檢查配置文件,或者建議清理環境后重新配置 !"exit 1fiSwitch_AliDDNS_Config_Exist="1"elseSwitch_AliDDNS_Config_Exist="0"fi }function_AliDDNS_SetConfig(){# AliDDNS_DomainNameif [ "${AliDDNS_DomainName}" = "" ]; thenecho -e "\n${Msg_Info}請輸入一級域名 (比如 example.com)"read -p "(此項必須填寫,查看幫助請輸入“h”):" AliDDNS_DomainName[ "${AliDDNS_DomainName}" = "h" ] && function_document_AliDDNS_DomainName && echo -e "${Msg_Info}請輸入一級域名 (比如 example.com)" && read -p "(此項必須填寫,查看提示請輸入 "h"):" AliDDNS_DomainNamewhile [ -z "${AliDDNS_DomainName}" ]doecho -e "${Msg_Error}此項不可為空,請重新填寫"echo -e "${Msg_Info}請輸入一級域名 (比如 example.com)"read -p "(此項必須填寫,查看幫助請輸入“h”):" AliDDNS_DomainNamedonefi# AliDDNS_SubDomainNameif [ "${AliDDNS_SubDomainName}" = "" ]; thenecho -e "\n${Msg_Info}請輸入二級域名 (比如 ddns)"read -p "(此項必須填寫,查看幫助請輸入“h”):" AliDDNS_SubDomainName[ "${AliDDNS_SubDomainName}" = "h" ] && function_document_AliDDNS_SubDomainName && echo -e "${Msg_Info}請輸入二級域名 (比如 ddns)" && read -p "(此項必須填寫,查看幫助請輸入“h”):" AliDDNS_SubDomainNamewhile [ -z "${AliDDNS_SubDomainName}" ]doecho -e "${Msg_Error}此項不可為空,請重新填寫"echo -e "${Msg_Info}請輸入二級域名 (比如 ddns)"read -p "(此項必須填寫,查看幫助請輸入“h”):" AliDDNS_SubDomainNamedonefi# AliDDNS_TTLif [ "${AliDDNS_TTL}" = "" ]; thenecho -e "\n${Msg_Info}請輸入記錄的TTL(Time-To-Live)值:"read -p "(默認為600,查看幫助請輸入“h”):" AliDDNS_TTL[ "${AliDDNS_TTL}" = "h" ] && function_document_AliDDNS_TTL && echo -e "${Msg_Info}請輸入記錄的TTL(Time-To-Live)值:" && read -p "(默認為600):" AliDDNS_TTL[ -z "${AliDDNS_TTL}" ] && echo -e "${Msg_Info}檢測到輸入空值,設置AliDDNS_TTL值為:“600”" && AliDDNS_TTL="600"fi# AliDDNS_AKif [ "${AliDDNS_AK}" = "" ]; thenecho -e "\n${Msg_Info}請輸入阿里云AccessKey ID"read -p "(此項必須填寫,查看幫助請輸入“h”):" AliDDNS_AK[ "${AliDDNS_AK}" = "h" ] && function_document_AliDDNS_AK && echo -e "${Msg_Info}請輸入阿里云AccessKey ID" && read -p "(此項必須填寫,查看幫助請輸入“h”):" AliDDNS_AKwhile [ -z "${AliDDNS_AK}" ]doecho -e "${Msg_Error}此項不可為空,請重新填寫"echo -e "${Msg_Info}請輸入阿里云AccessKey ID"read -p "(此項必須填寫,查看幫助請輸入“h”):" AliDDNS_AKdonefi# AliDDNS_SKif [ "${AliDDNS_SK}" = "" ]; thenecho -e "\n${Msg_Info}請輸入阿里云Access Key Secret"read -p "(此項必須填寫,查看幫助請輸入“h”):" AliDDNS_SK[ "${AliDDNS_SK}" = "h" ] && function_document_AliDDNS_SK && echo -e "${Msg_Info}請輸入阿里云Access Key Secret" && read -p "(默認為600):" AliDDNS_SKwhile [ -z "${AliDDNS_SK}" ]doecho -e "${Msg_Error}此項不可為空,請重新填寫"echo -e "${Msg_Info}請輸入阿里云Access Key Secret"read -p "(此項必須填寫,查看幫助請輸入“h”):" AliDDNS_SKdonefi# AliDDNS_LocalIPif [ "${Switch_AliDDNS_ExpertMode}" = "1" ]; thenif [ "${AliDDNS_LocalIP}" = "" ]; thenecho -e "\n${Msg_Info}請輸入獲取本機IP使用的命令"read -p "(查看幫助請輸入“h”):" AliDDNS_LocalIP[ "${AliDDNS_LocalIP}" = "h" ] && function_document_AliDDNS_LocalIP && echo -e "${Msg_Info}請輸入獲取本機IP使用的命令" && read -p "(查看幫助請輸入“h”):" AliDDNS_LocalIP[ -z "${AliDDNS_LocalIP}" ] && echo -e "${Msg_Info}檢測到輸入空值,設置執行命令為:“curl -s whatismyip.akamai.com”" && AliDDNS_LocalIP="curl -s whatismyip.akamai.com"fielseAliDDNS_LocalIP="curl -s whatismyip.akamai.com"fi# AliDDNS_DomainServerIPif [ "${Switch_AliDDNS_ExpertMode}" = "1" ]; thenif [ "${AliDDNS_DomainServerIP}" = "" ]; thenecho -e "\n${Msg_Info}請輸入解析使用的DNS服務器"read -p "(此項必須填寫,查看幫助請輸入“h”):" AliDDNS_DomainServerIP[ "${AliDDNS_DomainServerIP}" = "h" ] && function_document_AliDDNS_DomainServerIP && echo -e "${Msg_Info}請輸入解析使用的DNS服務器" && read -p "(此項必須填寫,查看幫助請輸入“h”):" AliDDNS_DomainServerIP[ -z "${AliDDNS_DomainServerIP}" ] && echo -e "${Msg_Info}檢測到輸入空值,設置默認DNS服務器為:“223.5.5.5”" && AliDDNS_DomainServerIP="223.5.5.5"fielseAliDDNS_DomainServerIP="223.5.5.5"fi }function_AliDDNS_WriteConfig(){# 寫入配置文件echo -e "\n${Msg_Info}正在寫入配置文件……"if [ "${Switch_env_is_root}" = "1" ]; then Config_configdir="/etc/OneKeyAliDDNS/"elseConfig_configdir="~/OneKeyAliDDNS/"fimkdir -p ${Config_configdir}rm -f ${Config_configdir}config.cfgcat>${Config_configdir}config.cfg<<EOF AliDDNS_DomainName="${AliDDNS_DomainName}" AliDDNS_SubDomainName="${AliDDNS_SubDomainName}" AliDDNS_TTL="${AliDDNS_TTL}" AliDDNS_AK="${AliDDNS_AK}" AliDDNS_SK="${AliDDNS_SK}" AliDDNS_LocalIP="${AliDDNS_LocalIP}" AliDDNS_DomainServerIP="${AliDDNS_DomainServerIP}" EOF }# 幫助文檔 function_document_AliDDNS_DomainName(){echo -e "${Msg_Info}${Font_Green}AliDDNS_DomainName 說明${Font_Suffix} 這個參數決定你要修改的DDNS域名中,一級域名的名稱。請保證你要配置的域名,DNS服務器已經轉入阿里云云解析 (免費版企業版都可以),也就是狀態必須為“正常”或者“未設置解析”,不可以為“DNS服務器錯誤”等提示。此參數和 AliDDNS_SubDomainName 連接到一起 (即 AliDDNS_SubDomainName.AliDDNS_DomainName)即為最終配置的DDNS域名。例如AliDDNS.DomainName設置為“example”,AliDDNS_SubDomainName設置為“ddns”連接到一起就是“ddns.example.com”\n"AliDDNS_DomainName="" }function_document_AliDDNS_SubDomainName(){echo -e "${Msg_Info}${Font_Green}AliDDNS_SubDomainName 說明${Font_Suffix} 這個參數決定你要修改的DDNS域名中,二級域名的名稱。請保證你要配置的域名,DNS服務器已經轉入阿里云云解析 (免費版企業版都可以),也就是狀態必須為“正常”或者“未設置解析”,不可以為“DNS服務器錯誤”等提示。此參數和 AliDDNS_SubDomainName 連接到一起 (即 AliDDNS_SubDomainName.AliDDNS_DomainName)即為最終配置的DDNS域名。例如AliDDNS.DomainName設置為“example”,AliDDNS_SubDomainName設置為“ddns”連接到一起就是“ddns.example.com”\n"AliDDNS_SubDomainName="" }function_document_AliDDNS_TTL(){echo -e "${Msg_Info}${Font_Green}AliDDNS_TTL 說明${Font_Suffix} 這個參數決定你要修改的DDNS記錄中,TTL(Time-To-Line)時長。越短的TTL,DNS更新生效速度越快 (但也不是越快越好,因情況而定)免費版產品可設置為 (600-86400) (即10分鐘-1天)收費版產品可根據所購買的云解析企業版產品配置設置為 (1-86400) (即1秒-1天)請免費版用戶不要設置TTL低于600秒,會導致運行報錯!\n"AliDDNS_TTL="" }function_document_AliDDNS_AK(){echo -e "${Msg_Info}${Font_Green}AliDDNS_AK 說明${Font_Suffix} 這個參數決定修改DDNS記錄所需要用到的阿里云API信息 (AccessKey ID)。獲取AccessKey ID和AccessKey Secret請移步:https://usercenter.console.aliyun.com/#/manage/ak${Font_Red}注意:${Font_Suffix}請不要泄露你的AK/SK給任何人!一旦他們獲取了你的AK/SK,將會直接擁有控制你阿里云賬號的能力!為了您的阿里云賬號安全,請不要隨意分享AK/SK(包括請求幫助時候的截圖)!"AliDDNS_AK="" }function_document_AliDDNS_SK(){echo -e "${Msg_Info}${Font_Green}AliDDNS_SK 說明${Font_Suffix} 這個參數決定修改DDNS記錄所需要用到的阿里云API信息 (Access Key Secret)。獲取AccessKey ID和AccessKey Secret請移步:https://usercenter.console.aliyun.com/#/manage/ak${Font_Red}注意:${Font_Suffix}請不要泄露你的AK/SK給任何人!一旦他們獲取了你的AK/SK,將會直接擁有控制你阿里云賬號的能力!為了您的阿里云賬號安全,請不要隨意分享AK/SK(包括請求幫助時候的截圖)!"AliDDNS_SK="" }function_document_AliDDNS_LocalIP(){echo -e "${Msg_Info}${Font_Green}AliDDNS_LocalIP 說明${Font_Suffix} 這個參數決定如何獲取到本機的IP地址。出于穩定性考慮,默認使用whatismyip.akamai.com作為獲取IP的方式,你也可以指定自己喜歡的獲取IP方式。輸入格式為需要執行的命令。請不要在命令中帶雙引號!解析配置文件時候會過濾掉!"AliDDNS_LocalIP="" }function_document_AliDDNS_DomainServerIP(){echo -e "${Msg_Info}${Font_Green}AliDDNS_DomainServerIP 說明${Font_Suffix} 這個參數決定如何獲取到DDNS域名當前的解析記錄。會使用nslookup命令查詢,此參數控制使用哪個DNS服務器進行解析。默認使用“223.5.5.5”進行查詢 (因為都是阿里家的東西)"AliDDNS_DomainServerIP="" }# 程序核心功能 ===========================================================# 獲取本機IP function_AliDDNS_GetLocalIP(){echo -e "${Msg_Info}正在獲取本機IP……"if [ "${AliDDNS_LocalIP}" = "" ]; thenecho -e "${Msg_Error}AliDDNS_LocalIP參數為空或無效!"echo -e "${Msg_Fail}程序運行出現致命錯誤,正在退出……"exit 1fiAliDDNS_LocalIP=`$AliDDNS_LocalIP 2>&1`if [ "${AliDDNS_LocalIP}" = "" ]; thenecho -e "${Msg_Error}未能獲取本機IP!"echo -e "${Msg_Fail}程序運行出現致命錯誤,正在退出……"exit 1elseecho -e "${Msg_Info}本機IP:${AliDDNS_LocalIP}"fi }# 新版獲取域名IP的方法,使用騰訊云的HttpDNS # #function_AliDDNS_DomainIP(){ # echo -e "${Msg_Info}正在獲取 $AliDDNS_SubDomainName.$AliDDNS_DomainName 的IP……" # AliDDNS_DomainIP=`curl -s http://119.29.29.29/d?dn=$AliDDNS_SubDomainName.$AliDDNS_DomainName` # if [ "$?" -eq "0" ]; then # # 如果執行成功,分離出結果中的IP地址 # if [ "${AliDDNS_DomainIP}" = "" ]; then # echo -e "${Msg_Info}解析結果:$AliDDNS_SubDomainName.$AliDDNS_DomainName -> (結果為空)" # echo -e "${Msg_Warning}$AliDDNS_SubDomainName.$AliDDNS_DomainName 未檢測到任何有效的解析記錄,可能是DNS記錄不存在或尚未生效" # echo -e "${Msg_Info}程序可能會報告InvalidParameter異常錯誤,如出現此錯誤,請前往阿里云云解析面板手動添加一條任意記錄值的A解析記錄即可!" # else # echo -e "${Msg_Info}解析結果:$AliDDNS_SubDomainName.$AliDDNS_DomainName -> $AliDDNS_DomainIP" # fi # # 進行判斷,如果本次獲取的新IP和舊IP相同,結束程序運行 # if [ "$AliDDNS_LocalIP" = "$AliDDNS_DomainIP" ] # then # echo -e "${Msg_Info}當前IP ($AliDDNS_LocalIP) 與 $AliDDNS_SubDomainName.$AliDDNS_DomainName ($AliDDNS_DomainIP) 的IP相同" # echo -e "${Msg_Success}未發生任何變動,無需進行改動,正在退出……" # exit 0 # fi # fi #} # 舊版獲取域名IP的方法,如果新版方法發生異常,請刪掉新版代碼,取消舊版的注釋,保存即可!# 獲取DDNS域名當前解析記錄IP function_AliDDNS_DomainIP(){echo -e "${Msg_Info}正在獲取 $AliDDNS_SubDomainName.$AliDDNS_DomainName 的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}'`if [ "${AliDDNS_DomainIP}" = "" ]; thenecho -e "${Msg_Info}解析結果:$AliDDNS_SubDomainName.$AliDDNS_DomainName -> (結果為空)"echo -e "${Msg_Info}$AliDDNS_SubDomainName.$AliDDNS_DomainName 未檢測到任何有效的解析記錄,可能是DNS記錄不存在或尚未生效"elseecho -e "${Msg_Info}解析結果:$AliDDNS_SubDomainName.$AliDDNS_DomainName -> $AliDDNS_DomainIP"fi# 進行判斷,如果本次獲取的新IP和舊IP相同,結束程序運行if [ "$AliDDNS_LocalIP" = "$AliDDNS_DomainIP" ]thenecho -e "${Msg_Info}當前IP ($AliDDNS_LocalIP) 與 $AliDDNS_SubDomainName.$AliDDNS_DomainName ($AliDDNS_DomainIP) 的IP相同"echo -e "${Msg_Success}未發生任何變動,無需進行改動,正在退出……"exit 0fi fi }function_AliDDNS_GetTimestamp(){echo -e "${Msg_Info}正在生成時間戳……"timestamp=`date -u "+%Y-%m-%dT%H%%3A%M%%3A%SZ"` }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" } # (Update 20180703 Bugfix : 屏蔽add_record,避免發生記錄重復沖突問題,感謝 mylyne 反饋) # 添加記錄值 (RecordID) # add_record() { # send_request "AddDomainRecord" "RR=$AliDDNS_SubDomainName&DomainName=$AliDDNS_DomainName&SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&TTL=$AliDDNS_TTL&Timestamp=$timestamp&Type=A&Value=$AliDDNS_LocalIP" # } # RecordID更新 function_AliDDNS_UpdateRecord(){echo -e "${Msg_Info}正在更新記錄……"if [ "${AliDDNS_RecordID}" = "" ]; thenecho -e "${Msg_Info}正在獲取RecordID……"AliDDNS_RecordID=`query_recordid | get_recordid`if [ "${AliDDNS_RecordID}" = "" ]; thenecho -e "${Msg_Warning}未能獲取到RecordID,可能沒有檢測到有效的解析記錄 (RecordID:$AliDDNS_RecordID)"elseecho -e "${Msg_Info}RecordID -> $AliDDNS_RecordID"echo -e "${Msg_Info}正在更新解析記錄:$AliDDNS_SubDomainName.$AliDDNS_DomainName -> $AliDDNS_LocalIP ……"update_record $AliDDNS_RecordIDecho -e "\n${Msg_Info}已經更新RecordID:$AliDDNS_RecordID"fifiif [ "${AliDDNS_RecordID}" = "" ]; then# 輸出失敗結果 (因為沒有獲取到RecordID)echo -e "${Msg_Fail}DDNS記錄更新失敗!"exit 1else# 輸出成功結果echo -e "${Msg_Success}DDNS記錄更新成功,新的IP為:$AliDDNS_LocalIP"# ServerChan推送組件function_ServerChan_SuccessMsgPushexit 0fi } function_AliDDNS_CleanEnviroment(){rm -f /etc/OneKeyAliDDNS/config.cfgrm -f ~/OneKeyAliDDNS/config.cfgrm -f /etc/OneKeyAliDDNS/config-ServerChan.cfgrm -f ~/OneKeyAliDDNS/config-ServerChan.cfgSwitch_env_is_root="0"AliDDNS_DomainName=""AliDDNS_SubDomainName=""AliDDNS_TTL=""AliDDNS_AK=""AliDDNS_SK=""AliDDNS_LocalIP=""AliDDNS_DomainServerIP=""Switch_ServerChan_Enable="0"ServerChan_SCKEY=""ServerChan_Text=""ServerChan_Content="" } function_AliDDNS_ShowVersion(){echo -e " # AliDDNS 工具 (阿里云云解析修改工具) # # Build: ${BuildTime} # 支持平臺: CentOS/Debian/Ubuntu # 作者: iLemonrain (原作者: kyriosli/koolshare-aliddns) # Blog: https://blog.ilemonrain.com # E-mail: ilemonrain@ilemonrain.com " exit 0 } function_ServerChan_Configure(){if [ "${ServerChan_SCKEY}" = "" ]; thenecho -e "\n${Msg_Info}請輸入ServerChan SCKEY:"read -p "(此項必須填寫):" ServerChan_SCKEY[ "${ServerChan_SCKEY}" = "h" ] && function_document_ServerChan_SCKEY && echo -e "${Msg_Info}請輸入ServerChan SCKEY:" && read -p "(此項必須填寫,查看提示請輸入 "h"):" ServerChan_SCKEYwhile [ -z "${ServerChan_SCKEY}" ]doecho -e "${Msg_Error}此項不可為空,請重新填寫"echo -e "${Msg_Info}請輸入ServerChan SCKEY:"read -p "(此項必須填寫):" ServerChan_SCKEYdonefiif [ "${ServerChan_ServerFriendlyName}" = "" ]; thenecho -e "\n${Msg_Info}請輸入服務器名稱:請使用中文/英文,不要使用除了英文下劃線以外任何符號"read -p "(此項必須填寫,便于識別):" ServerChan_ServerFriendlyName[ "${ServerChan_ServerFriendlyName}" = "h" ] && function_document_ServerChan_ServerFriendlyName && echo -e "${Msg_Info}請輸入服務器名稱:請使用中文/英文,不要使用除了英文下劃線以外任何符號" && read -p "(此項必須填寫,便于識別):" ServerChan_ServerFriendlyNamewhile [ -z "${ServerChan_ServerFriendlyName}" ]doecho -e "${Msg_Error}此項不可為空,請重新填寫"echo -e "${Msg_Info}請輸入服務器名稱:請使用中文/英文,不要使用除了英文下劃線以外任何符號"read -p "(此項必須填寫,便于識別):" ServerChan_ServerFriendlyNamedonefi } function_ServerChan_CheckConfig(){if [ -f "/etc/OneKeyAliDDNS/config-ServerChan.cfg" ]; thenSwitch_ServerChan_ConfigExist="1"elseSwitch_ServerChan_ConfigExist="0"fi } function_ServerChan_ReadConfig(){if [ -f "/etc/OneKeyAliDDNS/config-ServerChan.cfg" ]; then# 讀取配置文件Switch_ServerChan_Enable=`sed '/^Switch_ServerChan_Enable=/!d;s/.*=//' /etc/OneKeyAliDDNS/config-ServerChan.cfg | sed 's/\"//g'`ServerChan_ServerFriendlyName=`sed '/^ServerChan_ServerFriendlyName=/!d;s/.*=//' /etc/OneKeyAliDDNS/config-ServerChan.cfg | sed 's/\"//g'`ServerChan_SCKEY=`sed '/^ServerChan_SCKEY=/!d;s/.*=//' /etc/OneKeyAliDDNS/config-ServerChan.cfg | sed 's/\"//g'`# 開關變量設1Switch_ServerChan_ConfigExist="1"elseSwitch_ServerChan_ConfigExist="0"fi } function_ServerChan_WriteConfig(){# 寫入配置文件echo -e "\n${Msg_Info}正在寫入配置文件……"if [ "${Switch_env_is_root}" = "1" ]; then Config_configdir="/etc/OneKeyAliDDNS/"elseConfig_configdir="~/OneKeyAliDDNS/"fimkdir -p ${Config_configdir}rm -f ${Config_configdir}config-ServerChan.cfgcat>${Config_configdir}config-ServerChan.cfg<<EOF Switch_ServerChan_Enable="${Switch_ServerChan_Enable}" ServerChan_ServerFriendlyName="${ServerChan_ServerFriendlyName}" ServerChan_SCKEY="${ServerChan_SCKEY}" EOF } # 如果你有動手能力,可以嘗試定制ServerChan推送的消息內容 function_ServerChan_SuccessMsgPush(){function_ServerChan_ReadConfigif [ "${Switch_ServerChan_ConfigExist}" = "1" ]; thenif [ ${Switch_ServerChan_Enable} = "1" ]; thenecho -e "${Msg_Info}檢測到ServerChan配置,正在推送消息到ServerChan平臺……"ServerChan_Text="服務器IP發生變動_AliDDNSv2"ServerChan_Content="服務器:${ServerChan_ServerFriendlyName},新的IP為:$AliDDNS_LocalIP,請注意服務器狀態"curl -s "http://sc.ftqq.com/$ServerChan_SCKEY.send?text=${ServerChan_Text}" -d "&desp=${ServerChan_Content}"if [ "$?" -eq "0" ]; thenecho -e "\n${Msg_Success}ServerChan 推送成功,服務器IP變動消息已經送達微信,請注意查收"elseecho -e "${Msg_Warning}ServerChan 推送失敗 (curl命令執行出現異常)"fififirm -f /etc/OneKeyAliDDNS/_ServerChan_tmp_output } Entrance_AliDDNS_Configure_And_Run(){function_Check_Rootfunction_Check_Enviromentfunction_Install_Enviromentfunction_AliDDNS_CheckConfigfunction_AliDDNS_SetConfigfunction_AliDDNS_WriteConfigfunction_AliDDNS_GetLocalIPfunction_AliDDNS_DomainIPfunction_AliDDNS_GetTimestampfunction_AliDDNS_UpdateRecordexit 0 } Entrance_AliDDNS_RunOnly(){function_AliDDNS_CheckConfigif [ "${Switch_AliDDNS_Config_Exist}" = "0" ]; thenecho -e "${Msg_Error} 未檢測到任何有效配置,請先不帶參數運行程序以進行配置!"exit 1fifunction_Check_Enviromentfunction_Install_Enviromentfunction_AliDDNS_GetLocalIPfunction_AliDDNS_DomainIPfunction_AliDDNS_GetTimestampfunction_AliDDNS_UpdateRecordexit 0 } Entrance_AliDDNS_ConfigureOnly(){function_Check_Rootfunction_Check_Enviromentfunction_Install_Enviromentfunction_AliDDNS_CheckConfigfunction_AliDDNS_SetConfigfunction_AliDDNS_WriteConfigecho -e "${Msg_Success}配置文件寫入完成"exit 0 } Entrance_ServerChan_Config(){function_Check_Rootfunction_Check_Enviromentfunction_ServerChan_CheckConfigif [ "${Switch_ServerChan_ConfigExist}" = "1" ]; thenecho -e "${Msg_Info}ServerChan配置文件已存在,如需重新配置請執行清理環境!"exit 0elseSwitch_ServerChan_Enable="1"function_ServerChan_Configurefunction_ServerChan_WriteConfigfiecho -e "${Msg_Success}配置文件寫入完成,重新執行腳本即可激活ServerChan功能"echo -e "${Msg_Info}如需禁用ServerChan,執行清理環境即可"exit 0 } Entrance_Global_CleanEnv(){echo -e "${Msg_Info}正在清理環境……"function_AliDDNS_CleanEnviromentecho -e "${Msg_Success}環境清理完成,重新執行腳本以開始配置"exit 0 } Entrance_Version(){function_AliDDNS_ShowVersionexit 0 } case "$1" inrun)Entrance_AliDDNS_RunOnly;;config)Entrance_AliDDNS_ConfigureOnly;;clean)Entrance_Global_CleanEnv;;clean)Entrance_Version;;*)echo -e "${Font_Blue} AliDDNS 工具 (阿里云云解析修改工具)${Font_Suffix} 使用方法 (Usage): AliDDNS.sh run 配置并運行工具 (如果已有配置將會直接運行) AliDDNS.sh config 僅配置工具 AliDDNS.sh clean 清理配置文件及運行環境 AliDDNS.sh version 顯示版本信息";; esac echo -e "${Msg_Info}選擇你要使用的功能: " echo -e " 1. 配置并運行 AliDDNS \n 2. 僅配置 AliDDNS \n 3. 僅運行 AliDDNS \n 4. 配置ServerChan微信推送 \n 5. 清理環境 \n 0. 退出 \n" read -p "輸入數字以選擇:" Function if [ "${Function}" == "1" ]; thenEntrance_AliDDNS_Configure_And_Run elif [ "${Function}" == "2" ]; thenEntrance_AliDDNS_ConfigureOnly elif [ "${Function}" == "3" ]; thenEntrance_AliDDNS_RunOnly elif [ "${Function}" == "4" ]; thenEntrance_ServerChan_Config elif [ "${Function}" == "5" ]; thenEntrance_Global_CleanEnv elseexit 0 fi總結
以上是生活随笔為你收集整理的阿里云手动更新dns解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: “AI鉴黄师”数据采集标注方案上线
- 下一篇: pyplot 画多个图时搅合到了一起_家