我想从NAT后面更新我的动态dns条目,ez-ipupdate不支持。它使用本地绑定的ip而不是外部ip地址。
我的提供商easydns只在我的平台Linux上明确支持ez-ipupdate解决方案。
我没有写一个基于python的deamon来获取外部IP地址并定期将它放入ez-ipupdate配置文件,我想知道是否有办法用python脚本替换整个东西。也许这会简化事情。
(我在谷歌上找不到任何关于此的信息,所以我在这里要求并回答这个问题以帮助其他人。)
答案 0 :(得分:0)
它确实会简化事情。至少对于easydns,ez-ipupdate只使用基本HTTP身份验证才真正执行简单的GET请求。
以下代码是一个起点。它经过测试,有效。它需要来自pypi的requests
和ipgetter
模块。
import time
import ipgetter
import requests
import datetime
from requests.auth import HTTPBasicAuth
def update(user, auth_token, hostname, partner="easydns", cache_fn=None):
if cache_fn is None:
cache_fn = "/var/cache/ez-ipupdate/default-cache"
my_ip = ipgetter.myip()
with open(cache_fn) as fobj:
secs, ip = fobj.read().strip().split(",")
if ip == my_ip:
return "IP doesn't need updating"
last_update = datetime.datetime.fromtimestamp(int(secs))
diff = datetime.datetime.now() - last_update
minutes_since_last_update = diff.total_seconds() / 60.0
if minutes_since_last_update < 4.99:
return "Too short time since last update..."
with open(cache_fn, "wb") as fobj:
fobj.write("{},{}\n".format(int(time.time()), my_ip))
url = (
'https://api.cp.easydns.com/dyn/ez-ipupdate.php?action=edit'
'&myip={address}&partner={partner}&wildcard=OFF&hostname={host}'
).format(address=my_ip, partner=partner, host=hostname)
r = requests.get(url, auth=HTTPBasicAuth(user, auth_token))
return "{} {}".format(r.status_code, r.reason)
现在只需运行一个定期调用更新函数的脚本,例如使用crontab -e
并添加以下行:
*/5 * * * * /path/to/script.py