华硕网络产品技术交流平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

查看: 5883|回复: 2

[求助] 求证实此方法可行不(花生壳DDNS)

[复制链接]

28

主题

53

回帖

446

积分

中级会员

Rank: 3Rank: 3

积分
446
QQ
发表于 2015-2-28 14:02:15 | 显示全部楼层 |阅读模式
本帖最后由 jsllb1986 于 2015-2-28 14:06 编辑


SHELL脚本实现DDNS(动态域名服务),以花生壳为例


由于路由器空间有限(未经改装,不支持USB),安装完其他软件包之后就没有多少剩余空间了。
于是,就萌生了用SHELL脚本来实现DDNS的想法,因为SHELL脚本最节省空间。
把此脚本上传到路由器中(不能是临时目录),在启动脚本和crond配置文件中设置运行即可。
此脚本在 OpenWrt Backfire 10.03.1固件版本下测试通过。

第一种方法,脚本内容如下:

#!/bin/sh -                                                                     
USER="用户名"                                                                  
PASS="密码"                                                            
DOMAIN="域名"
URL="http://${USER}{PASS}@ddns.oray.com:80/ph/update?hostname=${DOMAIN}"      # 花生壳的DDNS服务地址

# 如果不存在/tmp/oray目录,就创建该目录
if [ ! -d /tmp/oray ]; then                                                     
    mkdir /tmp/oray                                                         
fi

# 如果存在/tmp/oray/ip文件,就获取之前保存的WAN接口IP地址,没有默认为none
if [ -f /tmp/oray/ip ]; then                                                   
    old_ip=`cat /tmp/oray/ip`                                             
else                                                                           
    old_ip="none"                                                         
fi

# 获取当前WAN接口IP地址,IP地址是变化的(废话 ^_^)
current_ip=$(uci -P /var/state get network.wan.ipaddr)

# 把当前WAN接口IP地址写入/tmp/oray/ip,不管IP地址是否已变化
echo ${current_ip} > /tmp/oray/ip

# 如果当前WAN接口IP地址与之前保存的不相同(说明WAN接口IP地址已变化),就更新动态域名的IP地址
# 并把返回的结果保存到/tmp/oray/info文件,因为可能会失败
if [ "${old_ip}" != "${current_ip}" ] ; then                                       
    wget -q -O /tmp/oray/info -q ${URL}
    exit
fi

if [ ! -f /tmp/oray/info ]; then
    touch /tmp/oray/info
fi

通过返回的结果,判断上次更新是否成功
req=`cat /tmp/oray/info | grep good`
# 如果上次更新失败,那么再次更新动态域名的IP地址
if [ -z "${req}" ]; then   
        wget -q -O /tmp/oray/info -q ${URL}
fi

第二种方法,脚本内容如下:
#!/bin/sh -                                                                     
USER="用户名"                                                                  
PASS="密码"                                                            
DOMAIN="域名"                                                      
URL="http://${USER}{PASS}@ddns.oray.com:80/ph/update?hostname=${DOMAIN}"      

nslookup ${DOMAIN} > /tmp/oray                                                  

old_ip=`cat /tmp/oray |tail -1| awk '{ print $3}'`                              
current_ip=$(uci -P /var/state get network.wan.ipaddr)                                                                          

if [ "${old_ip}" != "${current_ip}" ] ; then
    # 最好指定一下输出文件路径,否则会把返回结果保存到家目录下                                       
    wget -q -O /tmp/ddns -q ${URL}                                                              
fi

第三种方法,脚本内容如下:

#!/bin/sh -                                                                     
USER="用户名"                                                                  
PASS="密码"                                                            
DOMAIN="域名"
URL="http://${USER}{PASS}@ddns.oray.com:80/ph/update?hostname=${DOMAIN}"

if [ -f /tmp/ddns ]; then
    current_ip=$(uci -P /var/state get network.wan.ipaddr)
    req=`cat /tmp/ddns| grep "${current_ip}"`
    if [ ! -z "${req}" ]; then
        old_ip=`echo ${req}| awk '{ print $2}'`
        if [ "${old_ip}" = "${current_ip}" ]; then
            exit
        fi    fi
fi

wget -q -O /tmp/ddns -q ${URL}


总结:三种方法都能解决问题,第一种方法思路陈旧、罗嗦;第二种方法虽然简洁,但由于IP地址更新后,不会立即在本地DNS服务器生效,所以会造成过度更新的问题;第三种方法没有以上缺点。
引用此处文章1 文章2


微信扫一扫,阅读更方便^_^

http://xywicp.wicp.net:88

1

主题

20

回帖

153

积分

注册会员

Rank: 2

积分
153
发表于 2015-3-11 15:32:14 | 显示全部楼层
笑脸是什么符号?

4

主题

98

回帖

397

积分

中级会员

Rank: 3Rank: 3

积分
397
发表于 2015-3-15 15:32:05 | 显示全部楼层
本帖最后由 ttever 于 2015-3-15 15:35 编辑

是两个红色字符      :$    
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

快速回复 返回列表 搜索 官方QQ群
×

秒后自动关闭

小黑屋|手机版|Archiver|华硕网络产品技术交流平台 ( 苏ICP备16010857号-1 )苏公网安备 32050502000499号

GMT+8, 2024-3-29 02:33 , Processed in 0.030465 second(s), 32 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表