pppoe拨号 ,设置了动态dns,但是获取到的ip老会变成10开头的内网ip,有没有什么方法能判断当前获取的是内网ip就重新拨号直到获取到公网IP的脚本或软件?
感谢大神ssitssit,搞定了。参考:
http://www.right.com.cn/forum/forum.php?mod=viewthread&tid=100274
http://www.right.com.cn/forum/thread-139379-1-1.html
使用方法:
winscp /usr/bin目录下新建文件redial.sh,打开文件把脚本复制进去,属性设置777
在计划任务 crontab中每小时调用执行一次这个脚本:
- 0 */1 * * * sh /usr/bin/redial.sh
复制代码
效果图:
16年 8/9发布 改华硕[N14U N54U]5G 2G的7620老毛子Padavan固件 拨公网地址脚本:
使用方法:
由于老毛子固件重拨较久,这里使用了sleep 10来减少错误发生的概率。可以根据需要自行调整。
关于获取IP不准的情况:这里提供了下面一系列获取外网IP的网址(来自老毛子固件),可以根据需要自行替换:
checkip.dyndns.org
checkip.dyndns.org:8245
echo.tzo.com
ip.dnsexit.com
ip.changeip.com
myip.dnsomatic.com
ip1.dynupdate.no-ip.com
checkip.dns.he.net
checkip.zerigo.com
checkip.two-dns.de
ipv4.wtfismyip.com/text
ipv4.nsupdate.info/myip
myip.dtdns.com
members.3322.org/dyndns/getip
2017/8/13 更新
1.Openwrt/Pandorabox 脚本,放到/etc/hotplug.d/iface 目录下,权限777,输出写入log文件/tmp/diag_log,无需设置crontab,重启即可。
- #!/bin/sh
- sleep 3
- wanip=$(ifconfig pppoe-wan 2> /dev/null | grep ‘inet addr’ | awk ‘{print $2}’ | cut -d: -f2)
- #获取wan口ip
- sleep 2
- pubip=$(/usr/bin/wget -qO – ddns.oray.com/checkip|tr -cd [0-9.])
- #从网络获取公网IP
- echo “Public IP:” $pubip >> /tmp/dial_log
- echo “WAN IP:” $wanip >> /tmp/dial_log
- #显示IP
- if [ “$wanip” = “” ]||[ “$wanip” = “0.0.0.0” ]; then
- #如果获取的IP是无效,记为错误
- sleep 5
- ifup wan
- echo “IP error”
- elif [ “$pubip” = “$wanip” ]; then
- #如果外网IP和本地IP相同,则保留IP
- echo “dial success” >> /tmp/dial_log
- else
- #如果获取的是内网IP,重拨
- echo “Got Intranet IP:” $wanip “Redial …”>> /tmp/dial_log
- ifup wan
- sleep 2
- fi
复制代码
2.常规脚本,放到/usr/bin,权限777,增加了互斥锁。需设置crontab,同上文。
- #!/bin/sh
- if [ ! -z “/tmp/redial_ip_lock” ]; then
- touch /tmp/redial_ip_lock
- sleep 10
- times=’0′
- for i in
seq 30
- #做50次拨号循环,30次如果都没拨上也停止
- do
- sleep 2
- wanip=$(ifconfig pppoe-wan 2> /dev/null | grep ‘inet addr’ | awk ‘{print $2}’ | cut -d: -f2)
- #获取wan口ip
- sleep 2
- pubip=$(wget -qO – ddns.oray.com/checkip|tr -cd [0-9.])
- #从网络获取公网IP
- echo “Public IP:” $pubip
- echo “WAN IP:” $wanip
- #显示IP
- if [ “$wanip” = “” ]||[ “$wanip” = “0.0.0.0” ]; then
- #如果获取的IP是无效,记为错误
- if [ “$times” -ge “3” ]&&[ “$wanip” = “” ]||[ “$wanip” = “0.0.0.0” ]; then
- #如果连续3次都还是没有获取到ip,重拨
- times=’0′
- ifdown wan | ifup wan
- sleep 2
- continue
- else
- times=
expr $times + 1
; - echo “error times :” $times
- echo “waitting two seconds”
- sleep 2
- fi
- elif [ “$pubip” = “$wanip” ]; then
- #如果外网IP和本地IP相同,则保留IP
- echo “dial success”
- break
- else
- #如果获取的是内网IP,重拨
- echo “Intranet IP:” $wanip
- echo “Redial …”
- ifdown wan | ifup wan
- sleep 2
- fi
- done
- rm -f /tmp/redial_ip_lock
- fi
复制代码
2017/7/19 更新,直接将此新脚本替换原内容(老毛子固件)。
- #!/bin/sh
- ### Custom user script
- ### Called after internal WAN up/down action
- ### $1 – WAN action (up/down)
- ### $2 – WAN interface name (e.g. eth3 or ppp0)
- ### $3 – WAN IPv4 address
- logger “运行后 WAN 状态:” “WAN 状态:【$1】, WAN 接口:【$2】, WAN IP:【$3】”
- if [ $1 == “up” ] ; then
- sleep 5
- pubip=$(wget -qO – members.3322.org/dyndns/getip)
- #从网络获取公网IP
- wanip=$3
- #获取wan口ip
- logger “【公网脚本】出口IP:$pubip”
- logger “【公网脚本】WAN口IP:$wanip”
- #显示IP
- if [ “$wanip” = “” ]||[ “$wanip” = “0.0.0.0” ]; then
- #如果获取的IP是无效,记为错误
- logger “【公网脚本】拨号失败,等待10秒”
- sleep 10
- elif [ “$pubip” = “$wanip” ]; then
- #如果外网IP和本地IP相同,则保留IP
- logger “【公网脚本】拨号成功,当前ip:$wanip”
- /etc/storage/crontabs_script.sh up &
- else
- #如果获取的是内网IP,重拨
- logger “【公网脚本】获取到内网ip:$wanip,重拨”
- restart_wan
- fi
- fi
复制代码
- sleep 10
- pubip=$(wget -qO – members.3322.org/dyndns/getip)
- #从网络获取公网IP
- wanip=$(nvram get wan0_ipaddr)
- #获取wan口ip
- echo “PUBLIC IP:” $pubip
- logger “出口IP:$pubip”
- echo “WAN IP:” $wanip
- logger “WAN口IP:$wanip”
- #显示IP
- if [ “$wanip” = “” ]||[ “$wanip” = “0.0.0.0” ]; then
- #如果获取的IP是无效,记为错误
- echo “Waitting 10 seconds”
- logger “等待10秒”
- sleep 10
- elif [ “$pubip” = “$wanip” ]; then
- #如果外网IP和本地IP相同,则保留IP
- echo “Dial success”
- logger “拨号成功,当前ip:$wanip”
- break
- else
- #如果获取的是内网IP,重拨
- echo “Intranet IP:” $wanip
- logger “获取到内网ip:$wanip,重拨”
- echo “Redial …”
- restart_wan
- sleep 10
- fi
复制代码
8/29发布4.1版,更新少量内容:
1.修复循环重置计数
2.优化错误等待时间
3.修改提示内容
- #!/bin/sh
- times=’0′
- for i in
seq 50
; - #做50次拨号循环,50次如果都没拨上也停止
- do
- sleep 2
- wanip=$(ifconfig pppoe-wan 2> /dev/null | grep ‘inet addr’ | awk ‘{print $2}’ | cut -d: -f2)
- #获取wan口ip
- sleep 2
- pubip=$(wget -qO – ddns.oray.com/checkip|tr -cd [0-9.])
- #从网络获取公网IP
- echo “Public IP:” $pubip
- echo “WAN IP:” $wanip
- #显示IP
- if [ “$wanip” = “” ]||[ “$wanip” = “0.0.0.0” ]; then
- #如果获取的IP是无效,记为错误
- if [ “$times” -ge “3” ]&&[ “$wanip” = “” ]||[ “$wanip” = “0.0.0.0” ]; then
- #如果连续5次都还是没有获取到ip,重拨
- times=’0′
- ifdown wan | ifup wan
- sleep 2
- continue
- else
- times=
expr $times + 1
; - echo “error times :” $times
- echo “waitting two seconds”
- sleep 2
- fi
- elif [ “$pubip” = “$wanip” ]; then
- #如果外网IP和本地IP相同,则保留IP
- echo “dial success”
- break
- else
- #如果获取的是内网IP,重拨
- echo “Intranet IP:” $wanip
- echo “Redial …”
- ifdown wan | ifup wan
- sleep 2
- fi
- done
复制代码
经过测试,放出V4.0正式版:
更新内容:
1.根据4.0 Beta 修复 bug。
2.解决一处重复循环错误。
3.增加延时,避免本次重拨还没有完成,就进行下一次重拨的错误。
4.修复获取wan ip 和 公网 ip 为空的错误。
- #!/bin/sh
- times=’0′
- for i in
seq 50
; - #做50次拨号循环,50次如果都没拨上也停止
- do
- sleep 2
- wanip=$(ifconfig pppoe-wan 2> /dev/null | grep ‘inet addr’ | awk ‘{print $2}’ | cut -d: -f2)
- #获取wan口ip
- sleep 2
- pubip=$(wget -qO – ddns.oray.com/checkip|tr -cd [0-9.])
- #从网络获取公网IP
- echo “Public IP:” $pubip
- echo “WAN IP:” $wanip
- #显示IP
- if [ “$wanip” = “” ]||[ “$wanip” = “0.0.0.0” ]; then
- #如果获取的IP是无效,记为错误
- if [ “$times” -ge “5” ]&&[ “$wanip” = “” ]||[ “$wanip” = “0.0.0.0” ]; then
- #如果连续5次都还是没有获取到ip,重拨
- ifdown wan | ifup wan
- sleep 2
- continue
- else
- times=
expr $times + 1
; - echo “error times :” $times
- echo “waitting two seconds”
- sleep 2
- fi
- elif [ “$pubip” = “$wanip” ]; then
- #如果外网IP和本地IP相同,则保留IP
- echo “dial success”
- break
- else
- #如果获取的是内网IP,重拨
- echo $wanip
- ifdown wan | ifup wan
- sleep 2
- fi
- done
复制代码
8/26日晚再次更新,感谢@ssitssit 提供的新思路,更新内容V4.0 Beta
2. 联网获取公网IP,更准确
3. 增大使用范围,目前支持任意的非公网IP
4. 优化软件错误处理
5. 精简代码
- #!/bin/sh
- times=’0′
- for i in
seq 50
; - #做50次拨号循环,50次如果都没拨上也停止
- do
- pubip=$(wget -qO – ddns.oray.com/checkip|tr -cd [0-9.])
- #从网络获取公网IP
- wanip=$(ifconfig pppoe-wan 2> /dev/null | grep ‘inet addr’ | awk ‘{print $2}’ | cut -d: -f2)
- #获取wan口ip
- echo “Public IP:” $pubip
- echo “WAN IP:” $wanip
- if [ “wanip” = “” ]||[ “wanip” = “0.0.0.0” ];
- #如果获取的IP是无效,记为错误
- then
- times=
expr $times + 1
; - echo “error times :” $times
- echo “waitting two seconds”
- sleep 2
- if [ “$times” -ge “5” ]&&[ “$wanip” = “” ]; then
- #如果错误次数达到5次,重播
- ifdown wan | ifup wan
- sleep 2
- fi
- elif [ “$pubip” = “$wanip” ]
- then
- #如果外网IP和本地IP相同,则保留IP
- echo “success”
- break
- else
- echo $wanip
- ifdown wan | ifup wan
- sleep 2
- fi
- done
复制代码
8/26更新V3.0 脚本:
更新内容:
1.修复判断错误bug。
2.增加错误计数机制,多次错误获取不到IP重置wan口
3.修复程序稳定性。
- #!/bin/sh
- j=’0′
- for i in
seq 50
; - #做50次拨号循环,50次如果都没拨上也停止
- do
- IP=$(ifconfig pppoe-wan 2> /dev/null | grep ‘inet addr’ | awk ‘{print $2}’ | cut -d: -f2)
- #获取wan口ip
- IPP=${IP:0:2}
- #取wan口IP前二位
- echo “Current IP:”
- echo $IP
- if [ “$IPP” = “0.” ]; then
- #如果没有获取到IP,延时2秒
- echo “please wait 2 second”
- sleep 2
- elif [ “$IPP” = “” ]; then
- #意外情况,等待2秒
- echo “error,please wait 2 second”
- sleep 2
- j=
expr $j + 1
; - echo “error times :”
- echo $j
- if [ “$j” -ge “5” ]&&[ “$IPP” = “” ]; then
- ifdown wan | ifup wan
- sleep 2
- else
- continue
- fi
- elif [ “$IPP” = “10” ]; then
- #如果IP开头是10的话,重拨
- echo “Intranet IP:”
- echo $IP
- ifdown wan | ifup wan
- sleep 2
- else
- #保留IP,跳出循环
- echo “Public IP:”
- echo $IP
- break
- fi
- done
复制代码
8/25 更新:试用了一天的脚本,感觉还有些问题,现更新2.0版本。新手写shell脚本,老鸟请勿见笑
更新内容
1.修复一些逻辑错误
2.增加延时
3.增加错误处理
- #!/bin/sh
- for i in
seq 50
; - #做50次拨号循环,50次如果都没拨上也停止
- do
- IP=$(ifconfig pppoe-wan 2> /dev/null | grep ‘inet addr’ | awk ‘{print $2}’ | cut -d: -f2)
- #获取wan口ip
- IPP=${IP:0:2}
- #取wan口IP前二位
- echo “Current IP”
- echo $IP
- if [ “$IPP” = “0.” ]; then
- #如果没有获取到IP,延时2秒
- sleep 2
- echo “please wait 2 second”
- elif [ “$IPP” = “” ]; then
- #意外情况,等待2秒
- echo “error,please wait 2 second”
- sleep 2
- elif [ “$IPP” = “10” ]; then
- #如果IP开头是10的话,重拨
- echo “Intranet IP”
- echo $IP
- ifdown wan | ifup wan
- sleep 2
- else
- #保留IP,跳出循环
- echo “Public IP”
- echo $IP
- break
- fi
- done
复制代码
0 条评论