使用脚本更新阿里云DNS记录
公司沒(méi)有自己的固定公網(wǎng)IP地址,之前采用花生殼DDNS解析進(jìn)行域名訪(fǎng)問(wèn)。但是花生殼DDNS需要花錢(qián),免費(fèi)版的使用效果并不是很好,導(dǎo)致DDNS解析老是失敗,而且域名不是很好記。后來(lái)再阿里云上購(gòu)買(mǎi)了域名,因?yàn)闆](méi)有固定公網(wǎng)IP,所以每次IP變化就得更改解析記錄,非常不現(xiàn)實(shí)。后來(lái)在阿里云上找到了解決方法,思路就是使用阿里云上的API,使用腳本運(yùn)行在內(nèi)網(wǎng)服務(wù)器上,每當(dāng)檢測(cè)到自己公網(wǎng)IP變化,就調(diào)用阿里云API,修改自己域名解析到最新的公網(wǎng)地址上。這樣就可以實(shí)現(xiàn)動(dòng)態(tài)域名解析
1. 阿里云配置
登陸進(jìn)入阿里云控制臺(tái),配置域名解析
需要調(diào)用API,或OSS存儲(chǔ),則需要申請(qǐng)阿里云Acesskeys
按照提示,創(chuàng)建子用戶(hù)
按步驟創(chuàng)建好子用戶(hù),我們需要授權(quán)給子用戶(hù)。
按照以下方式進(jìn)行授權(quán)
然后進(jìn)入子賬戶(hù),創(chuàng)建Accesskey,創(chuàng)建好后,記得保存AK信息,不然進(jìn)入控股臺(tái)后無(wú)法查看AccessKeysecret
2內(nèi)網(wǎng)服務(wù)器配置
2.1 AliDDNS腳本
這個(gè)腳本是在阿里云社區(qū)里面找到的,整體不用太多修改,直接拿來(lái)用即可,非常完善
#!/bin/bash# 更新日志 # Update 20180914 : # [Fix] 再次修復(fù): CPU 100%占用問(wèn)題 # 這次找到了AliDDNS卡100%死循環(huán)的原因,并且加了一個(gè)小的檢測(cè)機(jī)制,理論上應(yīng)該不會(huì)再出現(xiàn) # CPU卡100%的問(wèn)題了(如果有問(wèn)題請(qǐng)私信腳本作者,謝謝!)BuildTime="20180914"# 專(zhuān)家模式開(kāi)關(guān) # 注意: 只有當(dāng)你了解整個(gè)AliDDNS工作流程,并且有一定的動(dòng)手能力,希望對(duì)AliDDNS腳本的更多參數(shù)進(jìn)行 # 深度定制時(shí),你可以打開(kāi)這個(gè)開(kāi)關(guān),會(huì)提供更多可以設(shè)置的選項(xiàng),但如果你不懂、超級(jí)小白,請(qǐng)不要 # 打開(kāi)這個(gè)開(kāi)關(guān)!因打開(kāi)專(zhuān)家模式后配置失誤發(fā)生的問(wèn)題,作者不負(fù)任何責(zé)任! # 如需打開(kāi)專(zhuān)家模式,請(qǐng)將腳本文件中的 Switch_AliDDNS_ExpertMode 變量值設(shè)置為1,即可打開(kāi) # 專(zhuān)家模式,如需關(guān)閉,請(qǐng)將此值設(shè)置為0! Switch_AliDDNS_ExpertMode="0" echo " " echo `date` # =================================================================================== # # 下面的代碼均為程序的核心代碼,請(qǐng)不要觸動(dòng)任何地方的代碼,直接運(yùn)行腳本即可使用! # # ===================================================================================# Shell環(huán)境初始化 # 字體顏色定義 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變量開(kāi)關(guān)初始化 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} # 支持平臺(tái): CentOS/Debian/Ubuntu # 作者: iLemonrain (原作者: kyriosli/koolshare-aliddns) # Blog: https://blog.ilemonrain.com # E-mail: ilemonrain@ilemonrain.com #========================================================#${Font_suffix}"# 檢查Root權(quán)限,并配置開(kāi)關(guān) 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}檢測(cè)到系統(tǒng)分支:CentOS"echo -e "${Msg_Info}正在安裝必需組件……"yum install curl bind-utils openssl -yelif [ "${Switch_env_system_release}" = "ubuntu" ]; thenecho -e "${Msg_Info}檢測(cè)到系統(tǒng)分支:Ubuntu"echo -e "${Msg_Info}正在安裝必需組件……"apt-get install curl dnsutils openssl -yelif [ "${Switch_env_system_release}" = "debian" ]; thenecho -e "${Msg_Info}檢測(cè)到系統(tǒng)分支:Debian"echo -e "${Msg_Info}正在安裝必需組件……"apt-get install curl dnsutils openssl -yelseecho -e "${Msg_Warning}系統(tǒng)分支未知,取消環(huán)境安裝,建議手動(dòng)安裝環(huán)境!"fiif [ -f "/usr/bin/curl" ]; thenSwitch_env_curl_exist="1"elseSwitch_env_curl_exist="0"echo -e "${Msg_Error}curl組件安裝失敗!可能會(huì)影響到程序運(yùn)行!建議手動(dòng)安裝!"fiif [ -f "/usr/bin/openssl" ]; thenSwitch_env_openssl_exist="1"elseSwitch_env_openssl_exist="0"echo -e "${Msg_Error}openssl組件安裝失敗!可能會(huì)影響到程序運(yùn)行!建議手動(dòng)安裝!"fiif [ -f "/usr/bin/nslookup" ]; thenSwitch_env_nslookup_exist="1"elseSwitch_env_nslookup_exist="0"echo -e "${Msg_Error}nslookup組件安裝失敗!可能會(huì)影響到程序運(yùn)行!建議手動(dòng)安裝!"fielif [ -f "/usr/bin/sudo" ]; thenecho -e "${Msg_Warning}檢測(cè)到當(dāng)前腳本并非以root權(quán)限啟動(dòng),正在嘗試通過(guò)sudo命令安裝……"if [ "${Switch_env_system_release}" = "centos" ]; thenecho -e "${Msg_Info}檢測(cè)到系統(tǒng)分支:CentOS"echo -e "${Msg_Info}正在安裝必需組件 (使用sudo)……"sudo yum install curl bind-utils -yelif [ "${Switch_env_system_release}" = "ubuntu" ]; thenecho -e "${Msg_Info}檢測(cè)到系統(tǒng)分支:Ubuntu"echo -e "${Msg_Info}正在安裝必需組件 (使用sudo)……"sudo apt-get install curl dnsutils -yelif [ "${Switch_env_system_release}" = "debian" ]; thenecho -e "${Msg_Info}檢測(cè)到系統(tǒng)分支:Debian"echo -e "${Msg_Info}正在安裝必需組件 (使用sudo)……"sudo apt-get install curl dnsutils -yelseecho -e "${Msg_Warning}系統(tǒng)分支未知,取消環(huán)境安裝,建議手動(dòng)安裝環(huán)境!"fielseecho -e "${Msg_Error}系統(tǒng)缺少必需環(huán)境,并且無(wú)法自動(dòng)安裝,建議手動(dòng)安裝!"fifi }# 判斷是否有已存在的配置文件 (是否已經(jīng)配置過(guò)環(huán)境) function_AliDDNS_CheckConfig(){if [ -f "/etc/OneKeyAliDDNS/config.cfg" ]; thenecho -e "${Msg_Info}檢測(cè)到存在的配置,自動(dòng)讀取現(xiàn)有配置\n 如果你不需要,請(qǐng)通過(guò)菜單中的清理環(huán)境選項(xiàng)進(jì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}配置文件有誤,請(qǐng)檢查配置文件,或者建議清理環(huán)境后重新配置 !"exit 1fiSwitch_AliDDNS_Config_Exist="1"elseSwitch_AliDDNS_Config_Exist="0"fi }function_AliDDNS_SetConfig(){# AliDDNS_DomainNameif [ "${AliDDNS_DomainName}" = "" ]; thenecho -e "\n${Msg_Info}請(qǐng)輸入一級(jí)域名 (比如 example.com)"read -p "(此項(xiàng)必須填寫(xiě),查看幫助請(qǐng)輸入“h”):" AliDDNS_DomainName[ "${AliDDNS_DomainName}" = "h" ] && function_document_AliDDNS_DomainName && echo -e "${Msg_Info}請(qǐng)輸入一級(jí)域名 (比如 example.com)" && read -p "(此項(xiàng)必須填寫(xiě),查看提示請(qǐng)輸入 "h"):" AliDDNS_DomainNamewhile [ -z "${AliDDNS_DomainName}" ]doecho -e "${Msg_Error}此項(xiàng)不可為空,請(qǐng)重新填寫(xiě)"echo -e "${Msg_Info}請(qǐng)輸入一級(jí)域名 (比如 example.com)"read -p "(此項(xiàng)必須填寫(xiě),查看幫助請(qǐng)輸入“h”):" AliDDNS_DomainNamedonefi# AliDDNS_SubDomainNameif [ "${AliDDNS_SubDomainName}" = "" ]; thenecho -e "\n${Msg_Info}請(qǐng)輸入二級(jí)域名 (比如 ddns)"read -p "(此項(xiàng)必須填寫(xiě),查看幫助請(qǐng)輸入“h”):" AliDDNS_SubDomainName[ "${AliDDNS_SubDomainName}" = "h" ] && function_document_AliDDNS_SubDomainName && echo -e "${Msg_Info}請(qǐng)輸入二級(jí)域名 (比如 ddns)" && read -p "(此項(xiàng)必須填寫(xiě),查看幫助請(qǐng)輸入“h”):" AliDDNS_SubDomainNamewhile [ -z "${AliDDNS_SubDomainName}" ]doecho -e "${Msg_Error}此項(xiàng)不可為空,請(qǐng)重新填寫(xiě)"echo -e "${Msg_Info}請(qǐng)輸入二級(jí)域名 (比如 ddns)"read -p "(此項(xiàng)必須填寫(xiě),查看幫助請(qǐng)輸入“h”):" AliDDNS_SubDomainNamedonefi# AliDDNS_TTLif [ "${AliDDNS_TTL}" = "" ]; thenecho -e "\n${Msg_Info}請(qǐng)輸入記錄的TTL(Time-To-Live)值:"read -p "(默認(rèn)為600,查看幫助請(qǐng)輸入“h”):" AliDDNS_TTL[ "${AliDDNS_TTL}" = "h" ] && function_document_AliDDNS_TTL && echo -e "${Msg_Info}請(qǐng)輸入記錄的TTL(Time-To-Live)值:" && read -p "(默認(rèn)為600):" AliDDNS_TTL[ -z "${AliDDNS_TTL}" ] && echo -e "${Msg_Info}檢測(cè)到輸入空值,設(shè)置AliDDNS_TTL值為:“600”" && AliDDNS_TTL="600"fi# AliDDNS_AKif [ "${AliDDNS_AK}" = "" ]; thenecho -e "\n${Msg_Info}請(qǐng)輸入阿里云AccessKey ID"read -p "(此項(xiàng)必須填寫(xiě),查看幫助請(qǐng)輸入“h”):" AliDDNS_AK[ "${AliDDNS_AK}" = "h" ] && function_document_AliDDNS_AK && echo -e "${Msg_Info}請(qǐng)輸入阿里云AccessKey ID" && read -p "(此項(xiàng)必須填寫(xiě),查看幫助請(qǐng)輸入“h”):" AliDDNS_AKwhile [ -z "${AliDDNS_AK}" ]doecho -e "${Msg_Error}此項(xiàng)不可為空,請(qǐng)重新填寫(xiě)"echo -e "${Msg_Info}請(qǐng)輸入阿里云AccessKey ID"read -p "(此項(xiàng)必須填寫(xiě),查看幫助請(qǐng)輸入“h”):" AliDDNS_AKdonefi# AliDDNS_SKif [ "${AliDDNS_SK}" = "" ]; thenecho -e "\n${Msg_Info}請(qǐng)輸入阿里云Access Key Secret"read -p "(此項(xiàng)必須填寫(xiě),查看幫助請(qǐng)輸入“h”):" AliDDNS_SK[ "${AliDDNS_SK}" = "h" ] && function_document_AliDDNS_SK && echo -e "${Msg_Info}請(qǐng)輸入阿里云Access Key Secret" && read -p "(默認(rèn)為600):" AliDDNS_SKwhile [ -z "${AliDDNS_SK}" ]doecho -e "${Msg_Error}此項(xiàng)不可為空,請(qǐng)重新填寫(xiě)"echo -e "${Msg_Info}請(qǐng)輸入阿里云Access Key Secret"read -p "(此項(xiàng)必須填寫(xiě),查看幫助請(qǐng)輸入“h”):" AliDDNS_SKdonefi# AliDDNS_LocalIPif [ "${Switch_AliDDNS_ExpertMode}" = "1" ]; thenif [ "${AliDDNS_LocalIP}" = "" ]; thenecho -e "\n${Msg_Info}請(qǐng)輸入獲取本機(jī)IP使用的命令"read -p "(查看幫助請(qǐng)輸入“h”):" AliDDNS_LocalIP[ "${AliDDNS_LocalIP}" = "h" ] && function_document_AliDDNS_LocalIP && echo -e "${Msg_Info}請(qǐng)輸入獲取本機(jī)IP使用的命令" && read -p "(查看幫助請(qǐng)輸入“h”):" AliDDNS_LocalIP[ -z "${AliDDNS_LocalIP}" ] && echo -e "${Msg_Info}檢測(cè)到輸入空值,設(shè)置執(zhí)行命令為:“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}請(qǐng)輸入解析使用的DNS服務(wù)器"read -p "(此項(xiàng)必須填寫(xiě),查看幫助請(qǐng)輸入“h”):" AliDDNS_DomainServerIP[ "${AliDDNS_DomainServerIP}" = "h" ] && function_document_AliDDNS_DomainServerIP && echo -e "${Msg_Info}請(qǐng)輸入解析使用的DNS服務(wù)器" && read -p "(此項(xiàng)必須填寫(xiě),查看幫助請(qǐng)輸入“h”):" AliDDNS_DomainServerIP[ -z "${AliDDNS_DomainServerIP}" ] && echo -e "${Msg_Info}檢測(cè)到輸入空值,設(shè)置默認(rèn)DNS服務(wù)器為:“223.5.5.5”" && AliDDNS_DomainServerIP="223.5.5.5"fielseAliDDNS_DomainServerIP="223.5.5.5"fi }function_AliDDNS_WriteConfig(){# 寫(xiě)入配置文件echo -e "\n${Msg_Info}正在寫(xiě)入配置文件……"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 說(shuō)明${Font_Suffix} 這個(gè)參數(shù)決定你要修改的DDNS域名中,一級(jí)域名的名稱(chēng)。請(qǐng)保證你要配置的域名,DNS服務(wù)器已經(jīng)轉(zhuǎn)入阿里云云解析 (免費(fèi)版企業(yè)版都可以),也就是狀態(tài)必須為“正常”或者“未設(shè)置解析”,不可以為“DNS服務(wù)器錯(cuò)誤”等提示。此參數(shù)和 AliDDNS_SubDomainName 連接到一起 (即 AliDDNS_SubDomainName.AliDDNS_DomainName)即為最終配置的DDNS域名。例如AliDDNS.DomainName設(shè)置為“example”,AliDDNS_SubDomainName設(shè)置為“ddns”連接到一起就是“ddns.example.com”\n"AliDDNS_DomainName="" }function_document_AliDDNS_SubDomainName(){echo -e "${Msg_Info}${Font_Green}AliDDNS_SubDomainName 說(shuō)明${Font_Suffix} 這個(gè)參數(shù)決定你要修改的DDNS域名中,二級(jí)域名的名稱(chēng)。請(qǐng)保證你要配置的域名,DNS服務(wù)器已經(jīng)轉(zhuǎn)入阿里云云解析 (免費(fèi)版企業(yè)版都可以),也就是狀態(tài)必須為“正常”或者“未設(shè)置解析”,不可以為“DNS服務(wù)器錯(cuò)誤”等提示。此參數(shù)和 AliDDNS_SubDomainName 連接到一起 (即 AliDDNS_SubDomainName.AliDDNS_DomainName)即為最終配置的DDNS域名。例如AliDDNS.DomainName設(shè)置為“example”,AliDDNS_SubDomainName設(shè)置為“ddns”連接到一起就是“ddns.example.com”\n"AliDDNS_SubDomainName="" }function_document_AliDDNS_TTL(){echo -e "${Msg_Info}${Font_Green}AliDDNS_TTL 說(shuō)明${Font_Suffix} 這個(gè)參數(shù)決定你要修改的DDNS記錄中,TTL(Time-To-Line)時(shí)長(zhǎng)。越短的TTL,DNS更新生效速度越快 (但也不是越快越好,因情況而定)免費(fèi)版產(chǎn)品可設(shè)置為 (600-86400) (即10分鐘-1天)收費(fèi)版產(chǎn)品可根據(jù)所購(gòu)買(mǎi)的云解析企業(yè)版產(chǎn)品配置設(shè)置為 (1-86400) (即1秒-1天)請(qǐng)免費(fèi)版用戶(hù)不要設(shè)置TTL低于600秒,會(huì)導(dǎo)致運(yùn)行報(bào)錯(cuò)!\n"AliDDNS_TTL="" }function_document_AliDDNS_AK(){echo -e "${Msg_Info}${Font_Green}AliDDNS_AK 說(shuō)明${Font_Suffix} 這個(gè)參數(shù)決定修改DDNS記錄所需要用到的阿里云API信息 (AccessKey ID)。獲取AccessKey ID和AccessKey Secret請(qǐng)移步:https://usercenter.console.aliyun.com/#/manage/ak${Font_Red}注意:${Font_Suffix}請(qǐng)不要泄露你的AK/SK給任何人!一旦他們獲取了你的AK/SK,將會(huì)直接擁有控制你阿里云賬號(hào)的能力!為了您的阿里云賬號(hào)安全,請(qǐng)不要隨意分享AK/SK(包括請(qǐng)求幫助時(shí)候的截圖)!"AliDDNS_AK="" }function_document_AliDDNS_SK(){echo -e "${Msg_Info}${Font_Green}AliDDNS_SK 說(shuō)明${Font_Suffix} 這個(gè)參數(shù)決定修改DDNS記錄所需要用到的阿里云API信息 (Access Key Secret)。獲取AccessKey ID和AccessKey Secret請(qǐng)移步:https://usercenter.console.aliyun.com/#/manage/ak${Font_Red}注意:${Font_Suffix}請(qǐng)不要泄露你的AK/SK給任何人!一旦他們獲取了你的AK/SK,將會(huì)直接擁有控制你阿里云賬號(hào)的能力!為了您的阿里云賬號(hào)安全,請(qǐng)不要隨意分享AK/SK(包括請(qǐng)求幫助時(shí)候的截圖)!"AliDDNS_SK="" }function_document_AliDDNS_LocalIP(){echo -e "${Msg_Info}${Font_Green}AliDDNS_LocalIP 說(shuō)明${Font_Suffix} 這個(gè)參數(shù)決定如何獲取到本機(jī)的IP地址。出于穩(wěn)定性考慮,默認(rèn)使用whatismyip.akamai.com作為獲取IP的方式,你也可以指定自己喜歡的獲取IP方式。輸入格式為需要執(zhí)行的命令。請(qǐng)不要在命令中帶雙引號(hào)!解析配置文件時(shí)候會(huì)過(guò)濾掉!"AliDDNS_LocalIP="" }function_document_AliDDNS_DomainServerIP(){echo -e "${Msg_Info}${Font_Green}AliDDNS_DomainServerIP 說(shuō)明${Font_Suffix} 這個(gè)參數(shù)決定如何獲取到DDNS域名當(dāng)前的解析記錄。會(huì)使用nslookup命令查詢(xún),此參數(shù)控制使用哪個(gè)DNS服務(wù)器進(jìn)行解析。默認(rèn)使用“223.5.5.5”進(jìn)行查詢(xún) (因?yàn)槎际前⒗锛业臇|西)"AliDDNS_DomainServerIP="" }# 程序核心功能 ===========================================================# 獲取本機(jī)IP function_AliDDNS_GetLocalIP(){echo -e "${Msg_Info}正在獲取本機(jī)IP……"if [ "${AliDDNS_LocalIP}" = "" ]; thenecho -e "${Msg_Error}AliDDNS_LocalIP參數(shù)為空或無(wú)效!"echo -e "${Msg_Fail}程序運(yùn)行出現(xiàn)致命錯(cuò)誤,正在退出……"exit 1fiAliDDNS_LocalIP=`$AliDDNS_LocalIP 2>&1`if [ "${AliDDNS_LocalIP}" = "" ]; thenecho -e "${Msg_Error}未能獲取本機(jī)IP!"echo -e "${Msg_Fail}程序運(yùn)行出現(xiàn)致命錯(cuò)誤,正在退出……"exit 1elseecho -e "${Msg_Info}本機(jī)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 # # 如果執(zhí)行成功,分離出結(jié)果中的IP地址 # if [ "${AliDDNS_DomainIP}" = "" ]; then # echo -e "${Msg_Info}解析結(jié)果:$AliDDNS_SubDomainName.$AliDDNS_DomainName -> (結(jié)果為空)" # echo -e "${Msg_Warning}$AliDDNS_SubDomainName.$AliDDNS_DomainName 未檢測(cè)到任何有效的解析記錄,可能是DNS記錄不存在或尚未生效" # echo -e "${Msg_Info}程序可能會(huì)報(bào)告InvalidParameter異常錯(cuò)誤,如出現(xiàn)此錯(cuò)誤,請(qǐng)前往阿里云云解析面板手動(dòng)添加一條任意記錄值的A解析記錄即可!" # else # echo -e "${Msg_Info}解析結(jié)果:$AliDDNS_SubDomainName.$AliDDNS_DomainName -> $AliDDNS_DomainIP" # fi # # 進(jìn)行判斷,如果本次獲取的新IP和舊IP相同,結(jié)束程序運(yùn)行 # if [ "$AliDDNS_LocalIP" = "$AliDDNS_DomainIP" ] # then # echo -e "${Msg_Info}當(dāng)前IP ($AliDDNS_LocalIP) 與 $AliDDNS_SubDomainName.$AliDDNS_DomainName ($AliDDNS_DomainIP) 的IP相同" # echo -e "${Msg_Success}未發(fā)生任何變動(dòng),無(wú)需進(jìn)行改動(dòng),正在退出……" # exit 0 # fi # fi #} # 舊版獲取域名IP的方法,如果新版方法發(fā)生異常,請(qǐng)刪掉新版代碼,取消舊版的注釋,保存即可!# 獲取DDNS域名當(dāng)前解析記錄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# 如果執(zhí)行成功,分離出結(jié)果中的IP地址AliDDNS_DomainIP=`echo "$AliDDNS_DomainIP" | grep 'Address:' | tail -n1 | awk '{print $NF}'`if [ "${AliDDNS_DomainIP}" = "" ]; thenecho -e "${Msg_Info}解析結(jié)果:$AliDDNS_SubDomainName.$AliDDNS_DomainName -> (結(jié)果為空)"echo -e "${Msg_Info}$AliDDNS_SubDomainName.$AliDDNS_DomainName 未檢測(cè)到任何有效的解析記錄,可能是DNS記錄不存在或尚未生效"elseecho -e "${Msg_Info}解析結(jié)果:$AliDDNS_SubDomainName.$AliDDNS_DomainName -> $AliDDNS_DomainIP"fi# 進(jìn)行判斷,如果本次獲取的新IP和舊IP相同,結(jié)束程序運(yùn)行if [ "$AliDDNS_LocalIP" = "$AliDDNS_DomainIP" ]thenecho -e "${Msg_Info}當(dāng)前IP ($AliDDNS_LocalIP) 與 $AliDDNS_SubDomainName.$AliDDNS_DomainName ($AliDDNS_DomainIP) 的IP相同"echo -e "${Msg_Success}未發(fā)生任何變動(dòng),無(wú)需進(jìn)行改動(dòng),正在退出……"exit 0fi fi }function_AliDDNS_GetTimestamp(){echo -e "${Msg_Info}正在生成時(shí)間戳……"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 } # 發(fā)送請(qǐng)求函數(shù) 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 '"' }# 請(qǐng)求記錄值 (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,避免發(fā)生記錄重復(fù)沖突問(wèn)題,感謝 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,可能沒(méi)有檢測(cè)到有效的解析記錄 (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}已經(jīng)更新RecordID:$AliDDNS_RecordID"fifiif [ "${AliDDNS_RecordID}" = "" ]; then# 輸出失敗結(jié)果 (因?yàn)闆](méi)有獲取到RecordID)echo -e "${Msg_Fail}DDNS記錄更新失敗!"exit 1else# 輸出成功結(jié)果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} # 支持平臺(tái): 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}請(qǐng)輸入ServerChan SCKEY:"read -p "(此項(xiàng)必須填寫(xiě)):" ServerChan_SCKEY[ "${ServerChan_SCKEY}" = "h" ] && function_document_ServerChan_SCKEY && echo -e "${Msg_Info}請(qǐng)輸入ServerChan SCKEY:" && read -p "(此項(xiàng)必須填寫(xiě),查看提示請(qǐng)輸入 "h"):" ServerChan_SCKEYwhile [ -z "${ServerChan_SCKEY}" ]doecho -e "${Msg_Error}此項(xiàng)不可為空,請(qǐng)重新填寫(xiě)"echo -e "${Msg_Info}請(qǐng)輸入ServerChan SCKEY:"read -p "(此項(xiàng)必須填寫(xiě)):" ServerChan_SCKEYdonefiif [ "${ServerChan_ServerFriendlyName}" = "" ]; thenecho -e "\n${Msg_Info}請(qǐng)輸入服務(wù)器名稱(chēng):請(qǐng)使用中文/英文,不要使用除了英文下劃線(xiàn)以外任何符號(hào)"read -p "(此項(xiàng)必須填寫(xiě),便于識(shí)別):" ServerChan_ServerFriendlyName[ "${ServerChan_ServerFriendlyName}" = "h" ] && function_document_ServerChan_ServerFriendlyName && echo -e "${Msg_Info}請(qǐng)輸入服務(wù)器名稱(chēng):請(qǐng)使用中文/英文,不要使用除了英文下劃線(xiàn)以外任何符號(hào)" && read -p "(此項(xiàng)必須填寫(xiě),便于識(shí)別):" ServerChan_ServerFriendlyNamewhile [ -z "${ServerChan_ServerFriendlyName}" ]doecho -e "${Msg_Error}此項(xiàng)不可為空,請(qǐng)重新填寫(xiě)"echo -e "${Msg_Info}請(qǐng)輸入服務(wù)器名稱(chēng):請(qǐng)使用中文/英文,不要使用除了英文下劃線(xiàn)以外任何符號(hào)"read -p "(此項(xiàng)必須填寫(xiě),便于識(shí)別):" 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'`# 開(kāi)關(guān)變量設(shè)1Switch_ServerChan_ConfigExist="1"elseSwitch_ServerChan_ConfigExist="0"fi }function_ServerChan_WriteConfig(){# 寫(xiě)入配置文件echo -e "\n${Msg_Info}正在寫(xiě)入配置文件……"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 }# 如果你有動(dòng)手能力,可以嘗試定制ServerChan推送的消息內(nèi)容 function_ServerChan_SuccessMsgPush(){function_ServerChan_ReadConfigif [ "${Switch_ServerChan_ConfigExist}" = "1" ]; thenif [ ${Switch_ServerChan_Enable} = "1" ]; thenecho -e "${Msg_Info}檢測(cè)到ServerChan配置,正在推送消息到ServerChan平臺(tái)……"ServerChan_Text="服務(wù)器IP發(fā)生變動(dòng)_AliDDNSv2"ServerChan_Content="服務(wù)器:${ServerChan_ServerFriendlyName},新的IP為:$AliDDNS_LocalIP,請(qǐng)注意服務(wù)器狀態(tài)"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 推送成功,服務(wù)器IP變動(dòng)消息已經(jīng)送達(dá)微信,請(qǐng)注意查收"elseecho -e "${Msg_Warning}ServerChan 推送失敗 (curl命令執(zhí)行出現(xiàn)異常)"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} 未檢測(cè)到任何有效配置,請(qǐng)先不帶參數(shù)運(yùn)行程序以進(jìn)行配置!"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}配置文件寫(xiě)入完成"exit 0 }Entrance_ServerChan_Config(){function_Check_Rootfunction_Check_Enviromentfunction_ServerChan_CheckConfigif [ "${Switch_ServerChan_ConfigExist}" = "1" ]; thenecho -e "${Msg_Info}ServerChan配置文件已存在,如需重新配置請(qǐng)執(zhí)行清理環(huán)境!"exit 0elseSwitch_ServerChan_Enable="1"function_ServerChan_Configurefunction_ServerChan_WriteConfigfiecho -e "${Msg_Success}配置文件寫(xiě)入完成,重新執(zhí)行腳本即可激活ServerChan功能"echo -e "${Msg_Info}如需禁用ServerChan,執(zhí)行清理環(huán)境即可"exit 0 }Entrance_Global_CleanEnv(){echo -e "${Msg_Info}正在清理環(huán)境……"function_AliDDNS_CleanEnviromentecho -e "${Msg_Success}環(huán)境清理完成,重新執(zhí)行腳本以開(kāi)始配置"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 配置并運(yùn)行工具 (如果已有配置將會(huì)直接運(yùn)行) AliDDNS.sh config 僅配置工具 AliDDNS.sh clean 清理配置文件及運(yùn)行環(huán)境 AliDDNS.sh version 顯示版本信息";; esacecho -e "${Msg_Info}選擇你要使用的功能: " echo -e " 1. 配置并運(yùn)行 AliDDNS \n 2. 僅配置 AliDDNS \n 3. 僅運(yùn)行 AliDDNS \n 4. 配置ServerChan微信推送 \n 5. 清理環(huán)境 \n 0. 退出 \n" read -p "輸入數(shù)字以選擇:" Functionif [ "${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將此腳本保存為aliddns.sh 放在內(nèi)網(wǎng)服務(wù)器上即可
2.2 服務(wù)器配置
內(nèi)網(wǎng)服務(wù)器是centos7,需要安裝一些軟件包配置
yum install -y wget curl cronie將腳本保存名為aliddns.sh,路徑為/usr/sbin/;然后添加可執(zhí)行權(quán)限
chmod +x /usr/sbin/aliddns.sh
然后運(yùn)行腳本即可
輸入1回車(chē),然后輸入一級(jí)域名,如cctv.com,即在阿里云上申請(qǐng)的域名
然后按照提示逐步輸入
其他配置完成后,腳本會(huì)自動(dòng)檢測(cè)環(huán)境。
2.3計(jì)劃任務(wù)
腳本配置完畢后,增加計(jì)劃任務(wù),定時(shí)執(zhí)行
*/5 * * * * /usr/sbin/AliDDNS-v2.0.sh run >/dev/null 2>&1 &然后開(kāi)啟計(jì)劃任務(wù)即可
轉(zhuǎn)載于:https://blog.51cto.com/11555417/2406781
總結(jié)
以上是生活随笔為你收集整理的使用脚本更新阿里云DNS记录的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【老生谈算法】matlab实现匈牙利算法
- 下一篇: php语言缺点,php语言优缺点分析