19

在我的学校,网络不可用(每天晚上23:00之后学校会断网,让我们睡觉>..<),然后ping永远不会停止,虽然我使用了参数ping -w1 ...

也就是说,当我使用:ping -q -w1 -c1 8.8.8.8检查 Internet 连接是否启动/关闭时,它将在那里没有任何输出并且不会退出,就像我使用单个cat.

我不知道为什么会这样,但我认为问题与school-internet-service有关。有什么建议吗?(我认为wget可能是一个不错的选择,但我该如何使用它?)

4

10 回答 10

40

使用 wget:

#!/bin/bash

wget -q --tries=10 --timeout=20 --spider http://google.com
if [[ $? -eq 0 ]]; then
        echo "Online"
else
        echo "Offline"
fi
于 2013-06-25T08:35:06.357 回答
21

如果学校真的关闭了他们的路由器,而不是将所有流量重定向到“你为什么不睡觉”页面,那么就不需要下载整个网页或发送 HTTP 标头。您所要做的就是建立连接并检查是否有人在听。

nc -z 8.8.8.8 53

这将输出“连接到 8.8.8.8 端口 53 [tcp/domain] 成功!” 如果有人在听,则返回值 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
于 2015-07-21T06:51:52.403 回答
4

采用:

#!/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;

输出将产生如下内容:

./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 秒。

于 2016-05-10T21:43:04.630 回答
2

使用超时选项-t

ping -q -t 5 -w1 -c1 8.8.8.8 t
于 2013-06-25T07:14:21.430 回答
2

安装 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
于 2014-01-06T11:12:03.790 回答
2

使用上面的例子。我写了这个脚本来记录你的连接状态: 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

然后,在终端中执行name.sh文件,然后查看log.csv同一文件夹中的日志状态信息。

于 2014-06-16T20:30:06.227 回答
2

没有 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

享受 ;)

于 2015-07-14T20:08:53.140 回答
1

我决定结合之前的一些答案,这样我以后就可以创建一个显示起起落落及其持续时间的图:

#!/bin/bash
#
# pinger is a bash shell script that monitors the network
# status every 15 seconds and records if it is up '1' or down '0'
# into the file log.csv from whence it may be plotted.
#
# author: J. W. Wooten, Ph.D.
# since: 11/12/2019
# version: 1.0
#
TIMESTAMP=`date +%s`
while [ 1 ]
  do
    nc -z -w 5 8.8.8.8 53  >/dev/null 2>&1
online=$?
    TIME=`date +%s`
    if [ $online -eq 0 ]; then
      echo "`date +%Y-%m-%d_%H:%M:%S_%Z` 1 $(($TIME-$TIMESTAMP))" | tee -a log.csv
    else
      echo "`date +%Y-%m-%d_%H:%M:%S_%Z` 0 $(($TIME-$TIMESTAMP))" | tee -a log.csv
    fi
    TIMESTAMP=$TIME
    sleep 15
  done;

这将每 15 秒输出到一个 CSV 文件。使用 Excel 或 Numbers,您可以读取文件并创建一个图表,该图表将显示 Internet 连接何时不可用以及持续时间。如果它从您的睡眠间隔发生变化,那么它正在花费时间尝试连接。我希望添加在下一次检测到网络关闭时向我发送文本的功能。

于 2019-11-12T16:28:37.607 回答
1

Majal 解决方案的一个变体只是测试 ping 的返回代码,如果站点响应,则返回 0,如果没有回复,则返回 1,如果网络不可达,则返回 2。

    ping -c 1 -t 5 8.8.8.8 2&>1
    rc=$?
    [[ $rc -eq 0 ]] && { echo "Connected to the Internet" ; exit 0 ; } \
 || [[ $rc -eq 1 ]] && { echo "No reply from Google DNS" ; exit 1 ; } \
 || [[ $rc -eq 2 ]] && { echo "Network unreachable" ; exit 2 ; }

使用 ping 的好处是不需要下载任何东西,提高了测试的速度。

于 2020-12-27T15:16:18.770 回答
0

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)连接到网络,但无法访问互联网(或至少谷歌),以及(3)连接到互联网。


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

~$ script-name && echo online || echo offline
于 2016-09-05T01:52:45.840 回答