jsllb1986 发表于 2015-2-28 14:02:15

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

本帖最后由 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


yahochina 发表于 2015-3-11 15:32:14

笑脸是什么符号?

ttever 发表于 2015-3-15 15:32:05

本帖最后由 ttever 于 2015-3-15 15:35 编辑

:$ 是两个红色字符      :和$    
页: [1]
查看完整版本: 求证实此方法可行不(花生壳DDNS)