首先说下情况,我的树莓派通过电信光猫dmz主机设置全端口映射得到了公网ip,ssh等连接都很迅速,ping值为60ms。上海电信200M宽带,上传25mbps。由于是动态公网ip,电信隔几天就换ip,这个差不多十天,不一定。我写了简单的脚本,用计划任务每分钟访问我的vultr服务器上的nginx服务(curl命令),nginx可以记录来访的ip,我就知道该树莓派的动态ip了。所以有时候访问不了了,ip变化了,我就看一下nginx日志后去阿里云手动修改dns解析。
以上的操作还是略麻烦的,后来百度下,得知阿里云dns有sdk,直接用脚本就能修改dns解析记录了。该方法比我原来手动的省事很多,而且能根据计划每分钟检查,所以可以说就算电信ip一天变一次也感觉不到。
下面记录如何设置的,安装配置sdk就不说了,github都有,应该不会出问题。获取阿里云的授权码也百度下即可,这里不说。下面是脚本内容(参考:http://zhangzr.com/2017/09/01/aliyunddns/):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | #!/usr/bin/env python # -*- coding: UTF-8 -*- import json import os import re import sys from datetime import datetime from aliyunsdkalidns.request.v20150109 import UpdateDomainRecordRequest, DescribeDomainRecordsRequest, \ DescribeDomainRecordInfoRequest from aliyunsdkcore import client #请填写你的Access Key ID access_key_id = "LTAIdR" #请填写你的Access Key Secret access_key_secret = "lv535M" #如果选择yes,则运行程序后仅现实域名信息,并不会更新记录,用于获取解析记录ID。 #如果选择no,则运行程序后不显示域名信息,仅更新记录 #i_dont_know_record_id = 'yes' i_dont_know_record_id = 'no' #请填写解析记录ID rc_record_id = '3995858176' #请填写你的一级域名 rc_domain = 'beavermagic.com' #请填写你的解析记录,对应的主机记录 rc_rr = 'server' #请填写你的记录类型,DDNS请填写A,表示A记录 rc_type = 'A' #请填写解析有效生存时间TTL,单位:秒 #rc_ttl = '1' rc_ttl = '600' #请填写返还内容格式,json,xml rc_format = 'json' def my_ip(): get_ip_method = os.popen( 'curl -s ip.cn' ) get_ip_responses = get_ip_method.readlines()[0] get_ip_pattern = re.compile(r '\d+\.\d+\.\d+\.\d+' ) get_ip_value = get_ip_pattern.findall(get_ip_responses)[0] return get_ip_value def check_records(dns_domain): clt = client.AcsClient(access_key_id, access_key_secret, 'cn-hangzhou' ) request = DescribeDomainRecordsRequest.DescribeDomainRecordsRequest() request.set_DomainName(dns_domain) request.set_accept_format(rc_format) #result = clt.do_action(request) result = clt.do_action_with_exception(request) return result def old_ip(): clt = client.AcsClient(access_key_id, access_key_secret, 'cn-hangzhou' ) request = DescribeDomainRecordInfoRequest.DescribeDomainRecordInfoRequest() request.set_RecordId(rc_record_id) request.set_accept_format(rc_format) #result = clt.do_action(request) result = clt.do_action_with_exception(request) result = json.JSONDecoder().decode(result) result = result[ 'Value' ] return result def update_dns(dns_rr, dns_type, dns_value, dns_record_id, dns_ttl, dns_format): clt = client.AcsClient(access_key_id, access_key_secret, 'cn-hangzhou' ) request = UpdateDomainRecordRequest.UpdateDomainRecordRequest() request.set_RR(dns_rr) request.set_Type(dns_type) request.set_Value(dns_value) request.set_RecordId(dns_record_id) request.set_TTL(dns_ttl) request.set_accept_format(dns_format) #result = clt.do_action(request) result = clt.do_action_with_exception(request) return result def write_to_file(): time_now = datetime.now().strftime( '%Y-%m-%d %H:%M:%S' ) #current_script_path = sys.path[7] current_script_path = sys.path[0] print current_script_path log_file = current_script_path + '/' + 'aliyun_ddns_log.txt' write = open(log_file, 'a' ) write.write(time_now + ' ' + str(rc_value_old) + '--->' + str(rc_value) + '\n' ) write.close() return if i_dont_know_record_id == 'yes' : pass #print check_records(rc_domain) elif i_dont_know_record_id == 'no' : rc_value = my_ip() rc_value_old = old_ip() if rc_value_old == rc_value: pass #print 'The specified value of parameter Value is the same as old' else : #print update_dns(rc_rr, rc_type, rc_value, rc_record_id, rc_ttl, rc_format) update_dns(rc_rr, rc_type, rc_value, rc_record_id, rc_ttl, rc_format) write_to_file() |
这里rc_domain = 'beavermagic.com'是一级域名,rc_rr = 'server'是对应的二级域名,如我这里二者组合就是server.beavermagic.com。刚开始不知道record id,所以设置为yes,然后获取到后将其改为no。
程序有时候报异常,如后去ip失败数组越界,或者修改了记录写日志,这样会导致Linux上自己收到邮件,比较烦。那么就将其输出重定向即可,我的crontab设置如下:
* * * * * /home/ssss/bin/ddns_pi.py >> /tmp/ddns_output.txt 2>&1
看一下它修改dns记录成功的截图:
————————————————
版权声明:本文为CSDN博主「捉不住的鼬鼠」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u012911347/article/details/83541374
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗