用BIND架设DDNS Server提供DDNS服务IP=${HTTP_X_FORWARDED_FOR:-$REMOTE_ADDR} FQDN="$LOGIN.$DOMAIN" # 删除上一次的登入 sql1="delete from RR where USERNAME='$LOGIN'" # 预设的动态更新项目为 A/MX sql2="insert into RR(USERNAME,FQDN,TYPE,RDATA) values('$LOGIN','$FQDN','A','$IP')" sql3="insert into RR(USERNAME,FQDN,TYPE,RDATA) values('$LOGIN','$FQDN','MX','10 $FQDN')" echo $sql1 | $MYSQL echo $sql2 | $MYSQL echo $sql3 | $MYSQL echo $LOGIN login success @$IP fi else # 以下只是网页的部份,我没有做 DDNS 申请,这个部份我想只要懂网页的朋友应该都会才是 cat <
EOF
fi
3.4 dyndns-cron.sh 定时产生 nsupdate
这只程序主要进行读取 Table RR , 并产生 nsupdate 所需要的指令格式后执行 nsupdate, 程序预设
每15秒执行一次(参数如上 dyndns.cfg 中的 UPD_FREQ 更新频率),您可以拿掉 while [ 1 ] 的循环,
改用 crontab 方式来跑,不过这样就较不容易控制一分钟以内的更新频率了,最后,这个程序会把 SOA
的序号改成更新时间,这个时间是 UTC 的秒数(意即 1970/1/1 至今秒数, date +%s 可得),由 SOA 的
序号就可以知道最后的 update 时间,这个原理和 .com 的verisign 或是 dyndns 中的 dyndns.org/
noip.com 是相同的.
另外,根据 RR_VALID 参数,若 USER 的登录时间 小于 现在时间-RR_VALID (秒数),则该 Record 视同
离线,所以我们需要进行 delete 动作
CODE:[Copy to clipboard]#!/bin/sh
while [ 1 ]
do
# 您必需调整路径,放在 while loop 里是要让修改了设定档即可生效,若不要可放在 while 之外
eval `cat /home/abelyang/dyndns/dyndns.cfg`
cat < server $DYNDNS_MASTER
zone $DOMAIN
EOF
# 取得最后一次的更新时间, 多减一秒是为了预防程序的 delay
last=`date -d "-$UPD_FREQ seconds -3 seconds" "+%Y%m%d%H%M%S"`
now=`date "+%Y%m%d%H%M%S"`
# 取得这段时间内有上来更新的 USER,这个部份不检查 IP 不变动情形
# 主要因为 nsupdate 巳执行很快,而且 named 它自己会检查重复更新的东西
echo "select FQDN,TTL,TYPE,RDATA from RR where CREATE_TIME between $last and $now" | $MYSQL| grep -v 'RDATA' | while read FQDN TTL TYPE RDATA RDATA2
do
# 组出更新指令,主要为一个删除,一个增加
echo "update delete $FQDN $TYPE $RDATA $RDATA2" >>$CMD_FILE
echo "update add $FQDN $TTL $TYPE $RDATA $RDATA2" >>$CMD_FILE
done
# 超过 RR_ALIVE (20分钟) 未有 login 数据则清除 DNS 记录
last=`date -d "-$RR_ALIVE seconds" "+%Y%m%d%H%M%S"`
# 备份旧的数据,并清除过时数据 (看你自己要不要备份了)
# echo "insert into RR_LOG select * from RR where CREATE_TIME<$last"|$MYSQL
# echo "delete from RR where CREATE_TIME < $last" |$MYSQL
# 取得过期 (RR_ALIVE) 而未登录的列表进行删除动作,因为我们用了 wildcard (*),所以若别人连时
更多相关文章
|
推荐文章
精彩文章
|