利用shell脚本,实现腾讯云DNSPod进行DDNS动态域名解析ipv6地址
快捷導航
- 開始
- 如何購買域名?
- 如何設置API(密鑰)
- 重點
- 如何使用DDNS動態域名服務
- 為什么使用DDNS
- 利用腳本更新DNS
- 更新情況
- 腳本代碼
- 常見問題
- 我無法利用腳本獲取到IPV6地址(IP地址提取錯誤)
- 我無法執行這個腳本
- 執行報錯syntax error near unexpected token `$'{\r''如何解決
開始
- 本代碼為shell腳本,且已在Linux環境測試,理論上可以在各種Linux設備進行DDNS動態域名服務,如群暉等NAS或Linux虛擬機。
- 代碼已在群暉和Ubuntu測試過。
- 在開始之前,首先你需要在騰訊云上購買域名或域名解析服務在騰訊云上。
如何購買域名?
在騰訊云域名注冊網頁上,可以購買域名。
在購買完成后,可以進入騰訊云的域名控制臺,查看域名信息。
如何設置API(密鑰)
在DNSPod即可設置API(密鑰)。
步驟
- 首先進入DNSPod控制臺;
- 然后點擊頭像,進入【我的賬號】,或直接進入DNS賬號中心;
- 接下來點擊左邊【賬號中心】的【密鑰管理】,或直接進入密鑰管理;
- 在密鑰管理中,點擊【創建密鑰】即可創建密鑰(API)
- 在輸入名稱之后(名稱隨意),便可以生成密鑰(API)
重點
在創建API時候,API的Token僅一次可見,如果忘記復制,需要重新申請。
在完成之后,你便獲得了ID與Token,這樣你就可以將這兩個信息填入代碼當中,即可利用代碼自動更新IP。
? 重點?
- ID——即腳本中dnspod_ddnsipv6_id,將"API_KEY_ID"替換為ID值
- Token——即腳本中的dnspod_ddnsipv6_token,將"API_KEY_TOKEN"替換為Token值
如何使用DDNS動態域名服務
為什么使用DDNS
- 家用寬帶的IPV6地址動態分配,每次撥號設備重啟或重新撥號,IP地址都會變換。
- 絕大多數家庭的IPV4地址為內網地址,無法使用IPV4地址訪問服務器。
- 對于群暉,自帶的DNSPod.cn的DDNS域名解析僅支持ipv4,實用性不大。
利用腳本更新DNS
更新情況
V1.02
- 修改了ipv6的提取規則,現在可以判定fe80開頭的地址;
- 對于ipv6的提取錯誤,添加了中文的提示;
V1.01
- 添加了對于syntax error的錯誤解決方法;
V1.00
- 發布
這里使用的是shell腳本,在Linux(如NAS、Linux虛擬機),該命令都可以執行。
對于shell腳本,使用的命令包括curl、ip這些與網絡相關的包,NAS與大部分虛擬機都自帶,如沒有自帶,也可以自行安裝。
代碼復制到文件后,將文件名的后綴,如txt等,修改為sh,例如dnsUpdate.sh(當然,你也可以使用bash命令,而不修改后綴。)
在復制完成后,將腳本中需要替換的名稱替換掉,你可以使用bash命令執行這個腳本,從而實現DNS的更新。
命令:bash 文件名稱或bash 文件絕對路徑,例如bash dnsUpdate.sh或bash /volume1/.../dnsUpdate.sh
你也可以不重名(這樣執行需要添加bash):
? 重點?
- 該代碼在更新或添加DNS記錄后,自動退出,如果需要實現DDNS,需要定時執行該代碼。
- 關于定時執行該代碼的時間,與設置的ttl時間有關,一般與ttl時間一致。
- 代碼僅需將開頭的7行(不包括第1行),替換為自己的需要的信息即可,后面可以保持不動。
下面放完整代碼。
腳本代碼
#!/usr/bin/bash dnspod_ddnsipv6_id="API_KEY_ID" #【API_id】將引號內容修改為獲取的API的ID dnspod_ddnsipv6_token="API_KEY_TOKEN" #【API_token】將引號內容修改為獲取的API的token dnspod_ddnsipv6_ttl="600" # 【ttl時間】解析記錄在 DNS 服務器緩存的生存時間,默認600(s/秒) dnspod_ddnsipv6_domain='替換自己所購買的域名' #【已注冊域名】引號里改成自己注冊的域名 dnspod_ddnsipv6_subdomain='替換為想要的名字' #【二級域名】將引號內容修改為自己想要的名字,需要符合域名規范,附常用的規范 local_net="eth0" # 【網絡適配器】 默認為eth0,如果你的公網ipv6地址不在eth0上,需要修改為對應的網絡適配器 # 常用的規范【二級域名】 # 【www】 常見主機記錄,將域名解析為 www.test.com # 【@】 直接解析主域名 test.com # 【*】 泛解析,匹配其他所有域名 *.test.com# 舉例 # 在騰訊云注冊域名,登陸DNSPOD,在【我的賬號】的【賬號中心】中,有【密鑰管理】 # 點擊創建密鑰即可創建一個API # 如果你在騰訊云注冊域名叫【test.com】 # 那么【dnspod_ddnsipv6_domain】后面就填【test.com】 # 然后根據常用的規范/自己想要的名字在【dnspod_ddnsipv6_subdomain】填入自己需要的名字 # 現假設為【file】,那么你的訪問地址為【file.test.com】 if [ "$dnspod_ddnsipv6_record" = "@" ] thendnspod_ddnsipv6_name=$dnspod_ddnsipv6_domain elsednspod_ddnsipv6_name=$dnspod_ddnsipv6_subdomain.$dnspod_ddnsipv6_domain fidie () {echo "Error: unable to find [public IPv6 address], please use the 'ip addr' command or query the network panel of the system to check the network card, and fill in the name of the network card with the IPv6 address in the 'local_net' position in the command file." >&2echo "IP地址提取錯誤: 在指定的網絡適配器上[$local_net]找不到<公網IPv6地址>(不是fe80開頭),請使用'ip addr'命令或在系統的網絡面板查詢有公網IP的網絡適配器,然后在腳本的[local_net]中用填寫網絡適配器的名稱。" >&2exit }ipv6_list=`ip addr show $local_net | grep "inet6.*global" | awk '{print $2}' | awk -F"/" '{print $1}'` || diefor ipv6 in ${ipv6_list[@]} doif [[ "$ipv6" =~ ^fe80.* ]]thencontinueelseecho select IP: $ipv6 >&1breakfi doneif [ "$ipv6" == "" ] || [[ "$ipv6" =~ ^fe80.* ]] thendie fidns_server_info=`nslookup -query=AAAA $dnspod_ddnsipv6_name 2>&1`dns_server_ipv6=`echo "$dns_server_info" | grep 'address ' | awk '{print $NF}'` if [ "$dns_server_ipv6" = "" ] thendns_server_ipv6=`echo "$dns_server_info" | grep 'Address: ' | awk '{print $NF}'` fiif [ "$?" -eq "0" ] thenecho "DNS server IP: $dns_server_ipv6" >&1if [ "$ipv6" = "$dns_server_ipv6" ]thenecho "The address is the same as the DNS server." >&1fiunset dnspod_ddnsipv6_record_id elsednspod_ddnsipv6_record_id="1" fisend_request() {local type="$1"local data="login_token=$dnspod_ddnsipv6_id,$dnspod_ddnsipv6_token&domain=$dnspod_ddnsipv6_domain&sub_domain=$dnspod_ddnsipv6_subdomain$2"return_info=`curl -X POST "https://dnsapi.cn/$type" -d "$data" 2> /dev/null` }query_recordid() {send_request "Record.List" "" }update_record() {send_request "Record.Modify" "&record_type=AAAA&record_line=默認&ttl=$dnspod_ddnsipv6_ttl&value=$ipv6&record_id=$dnspod_ddnsipv6_record_id" }add_record() {send_request "Record.Create" "&record_type=AAAA&record_line=默認&ttl=$dnspod_ddnsipv6_ttl&value=$ipv6" }if [ "$dnspod_ddnsipv6_record_id" = "" ] thenecho "seem exists, try update." >&1query_recordidcode=`echo $return_info | awk -F \"code\":\" '{print $2}' | awk -F \",\"message\" '{print $1}'`echo "return code $code" >&1if [ "$code" = "1" ]thendnspod_ddnsipv6_record_id=`echo $return_info | awk -F \"records\":.{\"id\":\" '{print $2}' | awk -F \",\"ttl\" '{print $1}'`update_recordecho "update sucessful" >&1elseecho "error code return, domain not exists, try add." >&1add_recordecho "add sucessful." >&1fi elseecho "domain not exists, try add."add_recordecho "add sucessful" >&1 fi常見問題
我無法利用腳本獲取到IPV6地址(IP地址提取錯誤)
- 首先,需要確認你的機器擁有ipv6地址。
- 在終端輸入ip addr或者使用ifconfig命令查詢是否存在ipv6地址,如果存在,可能腳本獲取的網絡適配器不對。
- 例如使用ip addr:
- 你可以觀察到,在eth0這個網絡適配器下,存在ipv6地址,并且為公網ipv6地址(如果以fe80開頭,則為本地地址)
- 用該網絡適配器名稱替換腳本中的local_net變量的值,即將原先的eth0替換為存在ipv6地址的適配器名稱。
我無法執行這個腳本
-
在Linux中,如果要使用腳本,需要使用bash命令,如果不帶bash,想直接執行,需要給該腳本賦予執行權限。
-
利用cd命令(在終端)可以進入腳本對應的文件夾。
-
使用ls -l命令可以查詢當前目錄(查詢當前目錄可用pwd命令)下的文件的詳細信息。
-
如上圖所示,在當前目錄下,使用ls -l即可查詢文件的詳細信息,或者ls -l 絕對路徑也可以直接查詢該目錄下的文件信息,其中有關于文件能否執行,在開頭可以看到(只需要關注是否有x,在Linux中表示執行權限)。
- 第一個rwx表示文件所有者的權限(如果中間有-表示缺少該權限),第二個為用戶組權限,第三個為其他人權限。
-
如果沒有x,那么,你需要為這個文件賦予執行權限。
-
使用:chmod ugo+rwx <filename>命令,即可修改這個文件的權限。
注:如果提示權限不足,則使用sudo chmod ugo+rwx <filename>這個命令。
(如果你沒有管理員權限則無法修改文件屬性)
在修改完文件的屬性之后,便可以再次執行該文件。
執行報錯syntax error near unexpected token `$’{\r’'如何解決
- 原因: 因為文件在Windows上復制的,復制之后,文件的換行符為dos格式的\r\n而Linux則為unix格式的\n,所以提示unexpected token $’{\r’(即語法錯誤)。
- 解決方法:首先在腳本執行之前,使用 sed -i 's/\r//g dnspod.sh'命令,然后再執行bash dnspod.sh。sed -i 's/\r//g' dnspod.sh bash dnspod.sh
- 其中sed命令為清除文本中的\r標識,注意,該標識在一般的文本編輯器自動省略。
總結
以上是生活随笔為你收集整理的利用shell脚本,实现腾讯云DNSPod进行DDNS动态域名解析ipv6地址的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: null和undefined的区别
- 下一篇: 二. Binding 详解