背景

    我在家里搭建了个服务,需要通过公网域名解析来访问家里的电脑,但是家里的拨号上网6天一次重拨,6天公网IP就会变化一次,我最开始没办法,就只能6天登陆一次阿里云DNS控制台改一次,但时间一长就觉得很累,于是我就想了一下办法如何让IP地址变化后自己去把阿里云上的DNS地址指向给我更新了。 

前提:

  • 你的DNS必须是在阿里申请的,也就是有阿里的DNS地址
  • 登陆阿里云DNS控制台,打开申请并下载你的AccessKey
  • 下载阿里云命令行工具
  • 用法说明以及区域代码帮助
地域名称 所在城市 Region ID 可用区数量
华北 1 青岛 cn-qingdao 2
华北 2 北京 cn-beijing 8
华北 3 张家口 cn-zhangjiakou 2
华北 5 呼和浩特 cn-huhehaote 2
华东 1 杭州 cn-hangzhou 8
华东 2 上海 cn-shanghai 6
华南 1 深圳 cn-shenzhen 5
华南 2 河源 cn-heyuan 2
西南 1 成都 cn-chengdu 2

这个Key的作用就是阿里云命令行有了这个Key,可以通过你传的参数直接改你指定的东西。

开始

  • 把阿里云命令行放在一个命令行环境变量能访问的地方,我是放在windows目录下的。然后cmd下执行:aliyun configure –mode AK –profile name(随便写个名字),然后会提示你输入AK的ID和密码,最后是区域(区域我写的是北京,代码在页面上有),输入正确的话这里就完了。
  • 只要configure成功了,那么aliyun命令行就能操作dns了,执行:aliyun alidns DescribeDomainRecords –DomainName xxx.com   (xxx.com就是你的域名),然后看看是不是获取到了你的域名信息。这里面你就能看到你的各种记录的RecordId,这个很重要。RR就是前缀,一会儿也是需要的。
  • 我们手动试一试能不能通过aliyun命令行修改DNS记录:aliyun alidns UpdateDomainRecord –RR test Recordid 18608047503392768 –Value 192.168.200.100   ;记住了这个命令中只需要3个参数,你改哪个域名前缀(test.xxx.com),他的RecordId是多少(18608047503392768 这个在上一步中就能看到的),我要把他的IP地址改成什么(192.168.200.100

自动化

既然我们已知道如何通过命令行来改DNS了,现在我们就能完全自动化来实现公网IP地址检测和修改了。我需要知道的是当前阿里云上test域名指向的IP以及我现在本地互联网公网IP是否一致,如果不一致,那么我执行这个命令去改阿里云DNS的地址,然后反复再去检测。于是通过编写以下python脚本来实现

import requests
import time
import os
import json

#下面三种办法都能获取当前计算机的公网IP地址,你可以任选一个
soip=re.findall(r\'\d+.\d+.\d+.\d+\',requests.get("http://txt.go.sohu.com/ip/soip").text)[0]
ip138=re.findall(r\'\d+.\d+.\d+.\d+\',requests.get("http://2000019.ip138.com/").text)[0]
getip=requests.get(\'http://members.3322.org/dyndns/getip\').text.strip()
#下面是在阿里云上获取当前域名指向的IP地址
IPonDNS=json.loads(os.popen(\'aliyun alidns DescribeDomainRecordInfo --RecordId 18522480556404736\').read())[\'Value\']
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) +" 当前互联网地址是:" + IPonDNS)
while 1:
    try:
        IPonDNS=json.loads(os.popen(\'aliyun alidns DescribeDomainRecordInfo --RecordId 18522480556404736\').read())[\'Value\']
        newIP = str(requests.get(\'http://members.3322.org/dyndns/getip\').text).strip()
        if (IPonDNS != newIP):
            print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + \'  公网IP已由\' + IPonDNS + \'变更为\' + newIP)
            os.system(\'aliyun alidns UpdateDomainRecord --RR test --RecordId 18522480556404736 --Type A --Value \' + newIP)
        time.sleep(200)
    except:
        pass

  

 技术交流群:70539804

版权声明:本文为boltkiller原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/boltkiller/p/12079446.html