原文章在
不过我尝试安装openwrt 路由器上
首先openwrt 的路由器空间必须大,我是安装在u盘上的,可能要10M左右空间 ,python安装也占不少空间.
程序中用到阿里云的库, aliyunsdkcore 和aliyunsdkalidns , 之前有人用pip 安装,但是openwrt 上不能, 所以下载其源码,然后解压后, 把里面核心代码复制到 /usr/lib/python2.7/XXXX (后面路径不记得) ,我看见别人自己提取相关几个文件,放在当前目录也可以.
update_ip.py 这个基本上来自前面那个文章,只不过我因为跑在openwrt上, 所以我改了获取ip的方式,改有get_ip这个脚本获取.
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 #!/usr/bin/env python # coding= utf-8 import subprocess import os import json #from urllib2 import urlopen from aliyunsdkcore.client import AcsClient from aliyunsdkcore.acs_exception.exceptions import ClientException from aliyunsdkcore.acs_exception.exceptions import ServerException from aliyunsdkalidns.request.v20150109 import DescribeDomainRecordsRequest from aliyunsdkalidns.request.v20150109 import UpdateDomainRecordRequest class DnsHandler: # 从阿里云开发者后台获取Access_Key_Id和Access_Key_Secret access_key_id = "" access_key_secret = "" region_id = "cn-hangzhou" # 填入自己的域名 domain_name = "" # 填入二级域名的RR值 rr_keyword = "" # 解析记录类型,一般为A记录 record_type = "A" # 用于储存解析记录的文件名 file_name = ".ip_addr" client = None record = None current_ip = '' # 初始化,获取client实例 def __init__(self): self.client = AcsClient( self.access_key_id, self.access_key_secret, self.region_id ) self.record = self.get_record() self.current_ip = self.get_current_ip() # 如果公网IP发生变化,则自动修改阿里云解析记录 def reset(self): if self.current_ip <> self.get_record_value(): # print self.current_ip print self.update_record(self.current_ip) self.get_record() # 获取阿里云域名解析完整记录,并使用文件缓存 def get_record(self): if os.path.isfile(self.file_name) : file_handler = open(self.file_name, 'r') r = file_handler.read() file_handler.close() else : request = DescribeDomainRecordsRequest.DescribeDomainRecordsRequest() request.set_PageSize(10) request.set_action_name("DescribeDomainRecords") request.set_DomainName(self.domain_name) request.set_RRKeyWord(self.rr_keyword) request.set_TypeKeyWord(self.record_type) r = self.client.do_action_with_exception(request) file_handler = open(self.file_name, 'w') file_handler.write(r) file_handler.close() return json.loads(r) # 获取阿里云域名解析记录ID def get_record_id(self) : return self.record["DomainRecords"]["Record"][0]["RecordId"] # 获取当前域名解析记录 def get_record_value(self) : return self.record["DomainRecords"]["Record"][0]["Value"] # 修改阿里云解析记录 def update_record(self, value): request = UpdateDomainRecordRequest.UpdateDomainRecordRequest() request.set_action_name("UpdateDomainRecord") request.set_RecordId(self.get_record_id()) request.set_Type(self.record_type) request.set_RR(self.rr_keyword) request.set_Value(value) return self.client.do_action_with_exception(request) # 获取当前公网IP def get_current_ip(self): #ip,retcode=os.system('./get_ip') out_bytes=subprocess.check_output('/root/get_ip') out_text= out_bytes.decode('utf8') out_text=out_text.replace("\n","") #print out_text #out_text.replace("\n","").replace("\r","") return out_text # //json.load(urlopen('http://jsonip.com'))['ip' # 实例化类并启动更新程序 dns = DnsHandler() dns.reset()
1 2 3 4 5 6 7 8 9 #!/bin/sh # check ip change and update it ip_regex="[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}" ipaddr=$(ifconfig pppoe-wan | awk '/inet /{print $2}' |grep -o "$ip_regex" ) echo $ipaddr
然后加到cron 里面 */15 * * * * python /root/update_ip.py