原文章在 
不过我尝试安装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