如何检查互联网访问在Linux中使用bash脚本?

在我的学校,互联网是不可用的(每晚23:0学校将杀死互联网,把我们放在床上> .. <),那么ping永远不会停止,虽然我已经使用了参数ping -w1 ...

也就是说,当我使用: ping -q -w1 -c1 8.8.8.8来检查networking是否启动/closures,它将会在那里没有任何输出,不会退出,就像我正在使用一个cat

你能理解我的问题吗? 我不知道这是为什么,但我认为这个问题与学校互联网服务有关 。 任何build议? (我认为wget可能是一个很好的select,但如何使用?)

Solutions Collecting From Web of "如何检查互联网访问在Linux中使用bash脚本?"

使用wget:

 #!/bin/bash wget -q --tries=10 --timeout=20 --spider http://google.com if [[ $? -eq 0 ]]; then echo "Online" else echo "Offline" fi 

如果学校实际上关闭了他们的路由器,而不是将所有流量重定向到“为什么不在床上”页面,那么就不需要下载整个网页或发送HTTP头。 所有你需要做的只是建立联系,并检查是否有人在倾听。

 nc -z 8.8.8.8 53 

这会输出“Connection to 8.8.8.8 port 53 [tcp / domain] succeeded!” 如果有人在倾听,则返回值0。

如果你想在shell脚本中使用它:

 nc -z 8.8.8.8 53 >/dev/null 2>&1 online=$? if [ $online -eq 0 ]; then echo "Online" else echo "Offline" fi 

使用超时选项-t

 ping -q -t 5 -w1 -c1 8.8.8.8 t 

安装fping:>少问题,然后ping。

 fping google.com | grep alive 

用例如:

 #!/bin/bash itest=$(fping google.com | grep alive) while [ "$itest" == "" ] do sleep 5 itest=$(fping google.com | grep alive) done echo now online 
 #!/bin/bash INTERNET_STATUS="UNKNOWN" TIMESTAMP=`date +%s` while [ 1 ] do ping -c 1 -W 0.7 8.8.4.4 > /dev/null 2>&1 if [ $? -eq 0 ] ; then if [ "$INTERNET_STATUS" != "UP" ]; then echo "UP `date +%Y-%m-%dT%H:%M:%S%Z` $((`date +%s`-$TIMESTAMP))"; INTERNET_STATUS="UP" fi else if [ "$INTERNET_STATUS" = "UP" ]; then echo "DOWN `date +%Y-%m-%dT%H:%M:%S%Z` $((`date +%s`-$TIMESTAMP))"; INTERNET_STATUS="DOWN" fi fi sleep 1 done; 

输出会产生如下的结果:

 bash-3.2$ ./internet_check.sh UP 2016-05-10T23:23:06BST 4 DOWN 2016-05-10T23:23:25BST 19 UP 2016-05-10T23:23:32BST 7 

一行结尾的数字显示了以前的状态的持续时间,即19秒,7秒

使用上面的例子,我写了这个脚本来记录连接的状态: https : //gist.github.com/cganterh/ffc2fffa8263857cbece

将以下代码保存在name.sh文件中。

 #!/bin/bash while true do wget -q --tries=10 --timeout=20 -O - http://google.com > /dev/null if [[ $? -eq 0 ]]; then echo $(date) "1" | tee -a log.csv else echo $(date) "0" | tee -a log.csv fi sleep 5 done 

没有wget

 #!/bin/bash echo -e "GET http://google.com HTTP/1.0\n\n" | nc google.com 80 > /dev/null 2>&1 if [ $? -eq 0 ]; then echo "Online" else echo "Offline" fi 

请享用 ;)

可靠的旧ping在单独的bash脚本中:

 #!/bin/bash ipaddr='8.8.8.8' # Google's public DNS server [[ -z `ping -c1 $ipaddr |& grep -o 'Network is unreachable'` ]] || exit 1 [[ -z `ping -c3 $ipaddr |& grep -o '100% packet loss'` ]] && exit 0 || exit 1 

把它放在一个单独的脚本上。 它将处理(1)不连接到网络,(2)连接到网络但不能访问互联网(或者至少Google),以及(3)连接到互联网的不同网络情况。


您可以稍后使用脚本的exit code来检查连通性,例如

 ~$ script-name && echo online || echo offline