年度更新请往下看:

 

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中每小时调用执行一次这个脚本:

  1. 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,重启即可。

  1. #!/bin/sh
  2. sleep 3
  3. wanip=$(ifconfig pppoe-wan 2> /dev/null | grep ‘inet addr’ | awk ‘{print $2}’ | cut -d: -f2)
  4. #获取wan口ip
  5. sleep 2
  6. pubip=$(/usr/bin/wget -qO – ddns.oray.com/checkip|tr -cd [0-9.])
  7. #从网络获取公网IP
  8. echo “Public IP:” $pubip >> /tmp/dial_log
  9. echo “WAN IP:” $wanip >> /tmp/dial_log
  10. #显示IP
  11. if [ “$wanip” = “” ]||[ “$wanip” = “0.0.0.0” ]; then
  12.         #如果获取的IP是无效,记为错误
  13.         sleep 5
  14.         ifup wan
  15.         echo “IP error”
  16. elif [ “$pubip” = “$wanip” ]; then
  17.         #如果外网IP和本地IP相同,则保留IP
  18.         echo “dial success” >> /tmp/dial_log
  19. else
  20.         #如果获取的是内网IP,重拨
  21.         echo “Got Intranet IP:” $wanip “Redial …”>> /tmp/dial_log
  22.         ifup wan
  23.         sleep 2
  24. fi

复制代码

2.常规脚本,放到/usr/bin,权限777,增加了互斥锁。需设置crontab,同上文。

  1. #!/bin/sh
  2. if [ ! -z “/tmp/redial_ip_lock” ]; then
  3.         touch /tmp/redial_ip_lock
  4.         sleep 10
  5.         times=’0′
  6.         for i in seq 30
  7.         #做50次拨号循环,30次如果都没拨上也停止
  8.         do
  9.                 sleep 2
  10.                 wanip=$(ifconfig pppoe-wan 2> /dev/null | grep ‘inet addr’ | awk ‘{print $2}’ | cut -d: -f2)
  11.                 #获取wan口ip
  12.                 sleep 2
  13.                 pubip=$(wget -qO – ddns.oray.com/checkip|tr -cd [0-9.])
  14.                 #从网络获取公网IP
  15.                 echo “Public IP:” $pubip
  16.                 echo “WAN IP:” $wanip
  17.                 #显示IP
  18.                 if [ “$wanip” = “” ]||[ “$wanip” = “0.0.0.0” ]; then
  19.                         #如果获取的IP是无效,记为错误
  20.                         if [ “$times” -ge “3” ]&&[ “$wanip” = “” ]||[ “$wanip” = “0.0.0.0” ]; then
  21.                                 #如果连续3次都还是没有获取到ip,重拨
  22.                                 times=’0′
  23.                                 ifdown wan | ifup wan
  24.                                 sleep 2
  25.                                 continue
  26.                         else
  27.                                 times=expr $times + 1;
  28.                                 echo “error times :” $times
  29.                                 echo “waitting two seconds”
  30.                                 sleep 2
  31.                         fi
  32.                 elif [ “$pubip” = “$wanip” ]; then
  33.                 #如果外网IP和本地IP相同,则保留IP
  34.                         echo “dial success”
  35.                         break
  36.                 else
  37.                 #如果获取的是内网IP,重拨
  38.                         echo “Intranet IP:” $wanip
  39.                         echo “Redial …”
  40.                         ifdown wan | ifup wan
  41.                         sleep 2
  42.                 fi
  43.         done
  44.         rm -f /tmp/redial_ip_lock
  45. fi

复制代码

2017/7/19 更新,直接将此新脚本替换原内容(老毛子固件)。

  1. #!/bin/sh
  2. ### Custom user script
  3. ### Called after internal WAN up/down action
  4. ### $1 – WAN action (up/down)
  5. ### $2 – WAN interface name (e.g. eth3 or ppp0)
  6. ### $3 – WAN IPv4 address
  7. logger  “运行后 WAN 状态:” “WAN 状态:【$1】, WAN 接口:【$2】, WAN IP:【$3】”
  8. if [ $1 == “up” ] ; then
  9.     sleep 5
  10.     pubip=$(wget -qO – members.3322.org/dyndns/getip)
  11.     #从网络获取公网IP
  12.     wanip=$3
  13.     #获取wan口ip
  14.     logger “【公网脚本】出口IP:$pubip”
  15.     logger “【公网脚本】WAN口IP:$wanip”
  16.     #显示IP
  17.     if [ “$wanip” = “” ]||[ “$wanip” = “0.0.0.0” ]; then
  18.     #如果获取的IP是无效,记为错误
  19.         logger “【公网脚本】拨号失败,等待10秒”
  20.         sleep 10
  21.     elif [ “$pubip” = “$wanip” ]; then
  22.         #如果外网IP和本地IP相同,则保留IP
  23.         logger “【公网脚本】拨号成功,当前ip:$wanip”
  24.         /etc/storage/crontabs_script.sh up &
  25.     else
  26.     #如果获取的是内网IP,重拨
  27.         logger “【公网脚本】获取到内网ip:$wanip,重拨”
  28.         restart_wan
  29.     fi
  30. fi

复制代码

  1. sleep 10
  2. pubip=$(wget -qO – members.3322.org/dyndns/getip)
  3. #从网络获取公网IP
  4. wanip=$(nvram get wan0_ipaddr)
  5. #获取wan口ip
  6. echo “PUBLIC IP:” $pubip
  7. logger “出口IP:$pubip”
  8. echo “WAN IP:” $wanip
  9. logger “WAN口IP:$wanip”
  10. #显示IP
  11. if [ “$wanip” = “” ]||[ “$wanip” = “0.0.0.0” ]; then
  12. #如果获取的IP是无效,记为错误
  13. echo “Waitting 10 seconds”
  14. logger “等待10秒”
  15. sleep 10
  16. elif [ “$pubip” = “$wanip” ]; then
  17. #如果外网IP和本地IP相同,则保留IP
  18. echo “Dial success”
  19. logger “拨号成功,当前ip:$wanip”
  20. break
  21. else
  22. #如果获取的是内网IP,重拨
  23. echo “Intranet IP:” $wanip
  24. logger “获取到内网ip:$wanip,重拨”
  25. echo “Redial …”
  26. restart_wan
  27. sleep 10
  28. fi

复制代码

 

=====================================================================================

 


8/29发布4.1版,更新少量内容:


1.修复循环重置计数
2.优化错误等待时间
3.修改提示内容


  1. #!/bin/sh
  2. times=’0′
  3. for i in seq 50;
  4. #做50次拨号循环,50次如果都没拨上也停止
  5. do
  6. sleep 2
  7. wanip=$(ifconfig pppoe-wan 2> /dev/null | grep ‘inet addr’ | awk ‘{print $2}’ | cut -d: -f2)
  8. #获取wan口ip
  9. sleep 2
  10. pubip=$(wget -qO – ddns.oray.com/checkip|tr -cd [0-9.])
  11. #从网络获取公网IP
  12. echo “Public IP:” $pubip
  13. echo “WAN IP:” $wanip
  14. #显示IP
  15. if [ “$wanip” = “” ]||[ “$wanip” = “0.0.0.0” ]; then
  16. #如果获取的IP是无效,记为错误
  17. if [ “$times” -ge “3” ]&&[ “$wanip” = “” ]||[ “$wanip” = “0.0.0.0” ]; then
  18. #如果连续5次都还是没有获取到ip,重拨
  19. times=’0′
  20. ifdown wan | ifup wan
  21. sleep 2
  22. continue
  23. else
  24. times=expr $times + 1;
  25. echo “error times :” $times
  26. echo “waitting two seconds”
  27. sleep 2
  28. fi
  29. elif [ “$pubip” = “$wanip” ]; then
  30. #如果外网IP和本地IP相同,则保留IP
  31. echo “dial success”
  32. break
  33. else
  34. #如果获取的是内网IP,重拨
  35. echo “Intranet IP:” $wanip
  36. echo “Redial …”
  37. ifdown wan | ifup wan
  38. sleep 2
  39. fi
  40. done

复制代码

经过测试,放出V4.0正式版:
更新内容:
1.根据4.0 Beta 修复 bug。
2.解决一处重复循环错误。
3.增加延时,避免本次重拨还没有完成,就进行下一次重拨的错误。
4.修复获取wan ip 和 公网 ip 为空的错误。

  1. #!/bin/sh
  2. times=’0′
  3. for i in seq 50;
  4. #做50次拨号循环,50次如果都没拨上也停止
  5. do
  6. sleep 2
  7. wanip=$(ifconfig pppoe-wan 2> /dev/null | grep ‘inet addr’ | awk ‘{print $2}’ | cut -d: -f2)
  8. #获取wan口ip
  9. sleep 2
  10. pubip=$(wget -qO – ddns.oray.com/checkip|tr -cd [0-9.])
  11. #从网络获取公网IP
  12. echo “Public IP:” $pubip
  13. echo “WAN IP:” $wanip
  14. #显示IP
  15. if [ “$wanip” = “” ]||[ “$wanip” = “0.0.0.0” ]; then
  16. #如果获取的IP是无效,记为错误
  17. if [ “$times” -ge “5” ]&&[ “$wanip” = “” ]||[ “$wanip” = “0.0.0.0” ]; then
  18. #如果连续5次都还是没有获取到ip,重拨
  19. ifdown wan | ifup wan
  20. sleep 2
  21. continue
  22. else
  23. times=expr $times + 1;
  24. echo “error times :” $times
  25. echo “waitting two seconds”
  26. sleep 2
  27. fi
  28. elif [ “$pubip” = “$wanip” ]; then
  29. #如果外网IP和本地IP相同,则保留IP
  30. echo “dial success”
  31. break
  32. else
  33. #如果获取的是内网IP,重拨
  34. echo $wanip
  35. ifdown wan | ifup wan
  36. sleep 2
  37. fi
  38. done

复制代码

8/26日晚再次更新,感谢@ssitssit 提供的新思路,更新内容V4.0 Beta

1. 重新构建脚本判断逻辑
2. 联网获取公网IP,更准确
3. 增大使用范围,目前支持任意的非公网IP
4. 优化软件错误处理
5. 精简代码

  1. #!/bin/sh
  2. times=’0′
  3. for i in seq 50;
  4. #做50次拨号循环,50次如果都没拨上也停止
  5. do
  6. pubip=$(wget -qO – ddns.oray.com/checkip|tr -cd [0-9.])
  7. #从网络获取公网IP
  8. wanip=$(ifconfig pppoe-wan 2> /dev/null | grep ‘inet addr’ | awk ‘{print $2}’ | cut -d: -f2)
  9. #获取wan口ip
  10. echo “Public IP:” $pubip
  11. echo “WAN IP:” $wanip
  12. if [ “wanip” = “” ]||[ “wanip” = “0.0.0.0” ];
  13. #如果获取的IP是无效,记为错误
  14. then
  15. times=expr $times + 1;
  16. echo “error times :” $times
  17. echo “waitting two seconds”
  18. sleep 2
  19. if [ “$times” -ge “5” ]&&[ “$wanip” = “” ]; then
  20. #如果错误次数达到5次,重播
  21. ifdown wan | ifup wan
  22. sleep 2
  23. fi
  24. elif [ “$pubip” = “$wanip” ]
  25. then
  26. #如果外网IP和本地IP相同,则保留IP
  27. echo “success”
  28. break
  29. else
  30. echo $wanip
  31. ifdown wan | ifup wan
  32. sleep 2
  33. fi
  34. done

复制代码

8/26更新V3.0 脚本:
更新内容:
1.修复判断错误bug。
2.增加错误计数机制,多次错误获取不到IP重置wan口
3.修复程序稳定性。

  1. #!/bin/sh
  2. j=’0′
  3. for i in seq 50;
  4. #做50次拨号循环,50次如果都没拨上也停止
  5. do
  6. IP=$(ifconfig pppoe-wan 2> /dev/null | grep ‘inet addr’ | awk ‘{print $2}’ | cut -d: -f2)
  7. #获取wan口ip
  8. IPP=${IP:0:2}
  9. #取wan口IP前二位
  10. echo “Current IP:”
  11. echo $IP
  12. if [ “$IPP” = “0.” ]; then
  13. #如果没有获取到IP,延时2秒
  14. echo “please wait 2 second”
  15. sleep 2
  16. elif [ “$IPP” = “” ]; then
  17. #意外情况,等待2秒
  18. echo “error,please wait 2 second”
  19. sleep 2
  20. j=expr $j + 1;
  21. echo “error times :”
  22. echo $j
  23. if [ “$j” -ge “5” ]&&[ “$IPP” = “” ]; then
  24. ifdown wan | ifup wan
  25. sleep 2
  26. else
  27. continue
  28. fi
  29. elif [ “$IPP” = “10” ]; then
  30. #如果IP开头是10的话,重拨
  31. echo “Intranet IP:”
  32. echo $IP
  33. ifdown wan | ifup wan
  34. sleep 2
  35. else
  36. #保留IP,跳出循环
  37. echo “Public IP:”
  38. echo $IP
  39. break
  40. fi
  41. done

复制代码

8/25 更新:试用了一天的脚本,感觉还有些问题,现更新2.0版本。新手写shell脚本,老鸟请勿见笑
更新内容
1.修复一些逻辑错误
2.增加延时
3.增加错误处理

  1. #!/bin/sh
  2. for i in seq 50;
  3. #做50次拨号循环,50次如果都没拨上也停止
  4. do
  5. IP=$(ifconfig pppoe-wan 2> /dev/null | grep ‘inet addr’ | awk ‘{print $2}’ | cut -d: -f2)
  6. #获取wan口ip
  7. IPP=${IP:0:2}
  8. #取wan口IP前二位
  9. echo “Current IP”
  10. echo $IP
  11. if [ “$IPP” = “0.” ]; then
  12. #如果没有获取到IP,延时2秒
  13. sleep 2
  14. echo “please wait 2 second”
  15. elif [ “$IPP” = “” ]; then
  16. #意外情况,等待2秒
  17. echo “error,please wait 2 second”
  18. sleep 2
  19. elif [ “$IPP” = “10” ]; then
  20. #如果IP开头是10的话,重拨
  21. echo “Intranet IP”
  22. echo $IP
  23. ifdown wan | ifup wan
  24. sleep 2
  25. else
  26. #保留IP,跳出循环
  27. echo “Public IP”
  28. echo $IP
  29. break
  30. fi
  31. done

复制代码

 

分类: openwrt

0 条评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注