如何在控制台中检查Internet连接?


31

有没有一种简便的方法可以从控制台检查Internet连接?我正在尝试在shell脚本中玩耍。我似乎想到的一种方法是检查HTTP响应代码以解释Internet连接是否工作正常。但我认为,必须有一种简便的方法,而无需检查从未崩溃的网站;)wget --spider http://www.google.co.in/

编辑:似乎有很多因素可以单独检查,这是一件好事。目前,我的目的是检查我的博客是否关闭。我已设置cron来每分钟检查一次。为此,我正在检查wget --spider的HTTP响应代码到我的博客。如果不是200,它会通知我(我相信这比仅ping它要好,因为该站点可能承受沉重的负担,并且可能超时或响应很晚)。今天昨天,我的互联网出现了问题。局域网连接正常,但是我无法访问任何站点。所以我继续收到通知,因为脚本在wget响应中找不到200。现在,我要确保当我具有互联网连接时它会向我显示通知。

因此,检查DNS和LAN连接对我来说有点过头了,因为我没有太多特别的需要来弄清楚它是什么问题。那么您如何建议我呢?

这是我的脚本,用于继续检查博客的停机时间:

#!/bin/bash

# Sending the output of the wget in a variable and not what wget fetches
RESULT=`wget --spider http://blog.ashfame.com 2>&1`
FLAG=0

# Traverse the string considering it as an array of words
for x in $RESULT; do
    if [ "$x" = '200' ]; then
        FLAG=1 # This means all good
    fi
done

if [ $FLAG -eq '0' ]; then
    # A good point is to check if the internet is working or not
        # Check if we have internet connectivity by some other site
        RESULT=`wget --spider http://www.facebook.com 2>&1`
        for x in $RESULT; do
            if [ "$x" = '200' ]; then
                FLAG=1 # This means we do have internet connectivity and the blog is actually down
            fi
        done

    if [ $FLAG -eq '1' ]; then
        DISPLAY=:0 notify-send -t 2000 -i /home/ashfame/Dropbox/Ubuntu/icons/network-idle.png "Downtime Alert!" "http://blog.ashfame.com/ is down."         
    fi  
fi

exit

这样,仅在博客响应代码存在问题的情况下,我才需要检查Internet连接。它有点沉重(因为我没有使用ping),但不应给出任何误报。对?另外,我如何每次都可以随机将ping到另一个站点,例如facebook,google,yahoo等。另外(我试图避免任何I / O)我可以写入日志文件,通过该文件可以检查停机检查的次数以及然后跳过进一步检查,直到站点关闭或进行更长的检查(10分钟而不是每分钟)。你怎么看?


“ Internet连接”没有明确的定义,您只能测试与特定服务或一组服务的连接。如果您的意思是“ LAN”连接,那么ping您的网络网关是一个不错的选择。
若奥·平托

用外行术语来说,我将定义Internet连接性是指您是否可以访问Internet。问题可以介于两者之间。我只需要区分它是可以正常工作,还是可以负责的问题中的一个。我希望我能说清楚。:)
Ashfame

Answers:


29

检查特定网站是否正常

首先,可以使用多种优质的在线监视服务。为了挑选一个,Pingdom提供了免费帐户来监视一个目标。(免责声明:我与Pingdom 没有任何关系)。

其次,使用wget --spider自己的脚本是一个好主意。当计算机关闭或DNS服务器不工作时,您会得到一些误报。检查返回码是实现此目的的直接方法:

wget --spider --quiet http://example.com
if [ "$?" != 0 ]; then
  echo "Website failed!" | mail -s "Website down" your_email@provider.tld
fi

再有,这种方法有缺点。如果您的提供商已缓存了您的DNS记录,但DNS服务器已关闭,则即使监视显示一切正常,其他人也无法访问您的站点。您可以使用编写简短的解决方法host,例如host example.com <your dns server IP>。如果DNS服务器没有响应,即使OpenDNS或您自己的提供商的DNS服务器工作正常,那也将返回错误。

检查互联网是否正常

在每种情况下都没有真正简单的方法来处理此问题。

例如,您可以ping -c1在多个知名网站上运行(例如www.google.com,facebook.com和ping.funet.fi),然后检查返回码以确定是否可以到达任何目的地。您可以使用variable自动检查返回码$?。参数-c1是将ping数据包的数量限制为1。

当有一个登录网关重定向所有ping和HTTP请求时,您可能会遇到一些公共wifi问题。如果是这样,即使您无法访问任何其他站点,您也可能会收到ping响应和非错误的HTTP状态代码。

如果要检查电缆状态,可以使用

sudo ethtool eth0

从输出(节选):

Speed: 1000Mb/s
Duplex: Full
Port: Twisted Pair
Link detected: yes

然而,这并不是告诉你是否真的有连接或没有,只是线是否连接和东西是在另一端。


这完全是我的设置,适用于Always-ON以太网。但是很高兴您指出了在某些情况下它如何无法正常工作。我也相信ping比wget快。你怎么看?如果我在任何地方检查200状态代码,我宁愿ping它。对?还是我应该知道的一些东西?
Ashfame

2
ping更快,更好,因为另一端不会为您生气。ping是非常安全的,但是即使这样也不能保证您可以打开网页。另外,防火墙可能阻止ping但允许HTTP请求。
Olli

1
如果您具有网络连接但dns损坏,则对4.2.2.2之类的著名dns服务器执行ping操作也很有用。
djeikyb 2011年

对于DNS检查,您当然可以使用host(DNS查询)。也非常快。
Olli

感谢您的回复@Olli&@djeikyb我已经更新了问题,请看看
Ashfame 2011年

7

我正在使用这种方法...

如果[[“ $(ping -c 1 8.8.8.8 | grep'100%丢包率')”!=“”]]]; 然后
    回声“不存在互联网”
    1号出口
其他
    回声“存在互联网”
    wget www.site.com
科幻

对于ping -c 1 8.8.8.8和我得到了不同的结果ping -c 1 www.google.com。那个怎么样?
MERose 2015年

2
请注意,这将在中国和其他国家不能在该块谷歌
汤姆Ĵ诺埃尔

7

我刚用过

nm-online

暂停直到网络管理器建立网络连接。运作良好。您也可以使用它来做其他事情。


6

通常使用诸如的监视工具来检查站点是否正常运行nagios。这将持续监视站点,并可以通知您发生故障。

在从命令行检查Internet是否启动时,我执行了许多步骤:

  • 检查Internet是否已启动ping google.com(检查DNS和已知的可达站点)。
  • 检查网站是否正在使用wgetw3m获取页面。

如果Internet没有启动,请向外诊断。

  • 检查网关可ping通。(检查ifconfig中的网关地址。)
  • 检查DNS服务器是否可ping通。(检查/etc/resolv.conf中的地址。)
  • 检查防火墙是否阻塞。(在我记录块时检查/ var / log / syslog。)

如果Internet已启动但站点已关闭,请检查并w3m http://isup.me/example.com替换example.com为出现的站点。如果未安装w3m浏览器,请使用wget,lynx或任何可用的命令行浏览器。


感谢您的建议!我的脚本是否满足在我的网站关闭时检查并提醒我的基本要求?万一有一些Internet连接问题,它将很安静
Ashfame

看起来您的脚本将完成您想要的。您可以将wget命令包括在if语句中if ! wget --spider http:///example.com; then
BillThor

您的意思是wget总是为200个HTTP响应代码返回1?
Ashfame 2011年

我的意思是测试与测试[ $? != 0 ]相同! command。据记录,wget成功返回0,失败返回0。无论哪种方式,if的行为都相同。如果wget在200响应上返回失败,则测试将以您编写它的任何一种方式失败。如果返回200以外的其他响应代码则返回
0。– BillThor

谢谢!这将使脚本更小且易于理解。
Ashfame 2011年

4

这是我用来测试Internet连接性的shell脚本:

警报

#! /bin/bash

if curl --silent --head http://www.google.com/ |
    egrep "20[0-9] Found|30[0-9] Found" >/dev/null
then
    echo Internet status: OK
else
    echo Internet status: ERROR
    mpg321 alarm.mp3 &> /dev/null
fi
sleep 60
clear

./alarm.sh

您将需要安装curl和mpg321

sudo apt-get install curl mpg321

如果需要声音警报功能,则需要在同一文件夹中将一个.mp3声音文件重命名为alarm.mp3。最后,配置网站URL和egrep以满足您的需求。


这工作完全即使用户是一个强制网络门户后面,在没有登录。
Ashhar哈桑

您可以使用egrep -q代替egrep ... > /dev/null
wjandrea

为什么脚本会调用自身而不是仅使用while循环?
wjandrea

哦,等等,它不会自称。它会调用alarm.sh在wd中调用的脚本,因此,如果您从其他目录中调用此脚本,则可能会出错,或者如果alarm.sh在wd中调用了脚本,则会改为调用该脚本。所以这是不好的做法。您可以"$0"改用它,但是while循环会更好。
wjandrea

“为什么脚本会调用自身而不是仅使用while循环?”:因为发布帖子时我是个菜鸟,是的,脚本正在调用自身。
01BTC10'1

2

检查互联网是否正常

sudo nm-tool | grep "State: connected" | wc -l

从输出(节选):

1 #System is connected to internet

但是,正如其他人所提到的,这并不能告诉您是否确实具有连通性。例如。您可以连接到路由器,而路由器不一定连接到互联网。


2
nm-tool已在Ubuntu 15.04+中删除,但您可以nmcli改用。例如[[ $(nmcli -f STATE -t g) = connected ]]

@Six nmcli -f STATE -t nm的好处是独立于网站!
Aquarius Power

1
请注意,nm-tool并且nmcli只会告诉您是否已连接到本地网络,即,是否已连接到家庭wifi /以太网。它不会告诉您是否可以访问您本地网络以外的任何地方,例如Internet。
Sergiy Kolodyazhnyy

1

我正在使用这种方法:

if curl -s --head  --request GET www.google.com | grep "200 OK" > /dev/null ; then
    echo "Internet is present"
else
    echo "Internet isn't present"
fi

它将尝试连接到知名网站,如果可以连接到它,那么我们将假定存在互联网。


0

我需要同一个问题的帮助,并且这样得到答案:

echo $(nm-online) $? connection problems

这是如何运作的?
wjandrea

它只是检查命令的状态(一个字符)nm-online...如果一切正常,它将返回0。通常在所有UNIX外壳中使用。
安东尼奥

0

检查互联网是否正常工作并非易事。ping是ICMP,因此即使Web代理已关闭,它也可能起作用。如果使用IP进行测试,DNS也会发生类似的情况。

由于我的Internet连接不稳定,因此我创建了此脚本(基于该脚本),该脚本发出柔和的和弦声音来打电话给我,并且在Internet连接恢复时还使用Ubuntu通知:

#!/bin/bash

hash play 2>&- || { echo >&2 "I require «play» but it's not installed. Try apt-get install sox. Aborting."; exit 1; }

WGET="`which wget`"
URL="http://www.google.com"
delay=3;
noConnectionMessage="No connection, trying again in $delay seconds...";
connectionMessage="WE HAVE INTERNET! :) Trying again in $delay seconds...";

echo "INTERNET TESTER: Type Ctrl+C to quit";
rm --force /tmp/index.site

function playSound {
    time=1;    # Time played
    if [ `sox --version| grep -oP "v[0-9.]+" | sed "s/[v.]//g"` -lt 1431 ]; then    #analize sox version, if greater than v14.3.1 can use pluck
        play -q -n synth $time sine;
    else
        play -q -n synth $time pluck $1;
        #for i in G4 G4 G4 E4;do play -n synth 0.1 pluck $i repeat 2;done    # You can play with something like this also :) (first three notes from Beethoven 5th symphony)
    fi
}

while [ 1 -eq 1 ]; do
    $WGET -q --tries=10 --timeout=2 $URL -O /tmp/index.site &> /dev/null
    if [ ! -s /tmp/index.site ];then
        echo $noConnectionMessage;
        #playSound E2
        sleep 1;
    else
        #~ zenity --warning --text "ADDRESS is back"
        notify-send -i "notification-network-wireless-full" "Connection state:" "$connectionMessage";
        echo $connectionMessage;
        playSound E3
    fi
    sleep $delay;
done

exit 0;

0

我一直在寻找可以持续测试我的互联网连接的脚本,只要我的服务器启动就可以启动该脚本,并执行以下操作:

  1. 首先,安装fping

    apt-get install fping
    
  2. 在/etc/init.d文件夹中创建一个包含以下内容的初始化脚本(我称之为testcon)

    #!/bin/bash
    
    PIDFILE=/var/run/testcon.pid
    
    . /lib/lsb/init-functions
    
    case "$1" in
      start)
            log_daemon_msg "Starting internet connection tester"
            /etc/init.d/testcond &
            echo $! > $PIDFILE
            log_end_msg $?
        ;;
      stop)
            log_daemon_msg "Stopping internet connection tester"
            PID=$(cat $PIDFILE)
            kill -9 "$PID"
            log_end_msg $?
        ;;
      *)
        echo "Usage: /etc/init.d/testcon {start|stop}"
        exit 1
        ;;
    esac
    
    exit 0
    
  3. 在/etc/init.d文件夹中创建一个包含以下内容的脚本(我称其为testcond)

    #echo Computer starting or testing daemon init
    while [ "$itest" == "" ] 
    do
        #wait 5 seconds 
        sleep 5
        itest=$(fping 8.8.8.8 | grep alive)
    done
    date | mail -s "Server is up and Internet is online" your_email@gmail.com
    
    #loop forever
    while [ "1" == "1" ] 
    do
        itest=$(fping 8.8.8.8 | grep alive)
        #if internet is down
        if [ "$itest" == "" ] 
        then
            #echo Internet is down
            #log time it was found down
            current_time=$(date)
            echo "Internet was found down @ $current_time" >> /mnt/data/Server/internet_log.txt
            #loop until it is back
            while [ "$itest" == "" ] 
            do
                #wait 60 seconds 
                sleep 60
                itest=$(fping 8.8.8.8 | grep alive) # test the internet
            done
            #when it is back
            current_time=$(date)
            echo "Internet is back        @ $current_time" >> /mnt/data/Server/internet_log.txt
            body=$(tail -2 /mnt/data/Server/internet_log.txt)
            echo "$body" | mail -s "Internet is back online" your_email@gmail.com
        fi
        #echo Internet is online
        #wait 60 seconds
        sleep 60
            done
    
  4. 然后,我运行以下命令以添加到启动中:

    sudo update-rc.d testcon defaults
    sudo update-rc.d testcon enable
    
  5. 重启


0

我的Broadcom BCM94331CD芯片面临Wi-Fi连接随机中断的问题。我设计了以下bash脚本(无限循环),每秒钟检查一次Internet Wi-Fi连接是否正常运行。此处建议的其他命令行将等待至少5到10秒钟,然后以状态关闭,即ping。同时,我也在寻找一种确定的解决方案。

从askubuntu上的结果中,我将不得不在bcmwl-kernel-source使用firmware-b43-installer和时清除软件包b43-fwcutter

感谢大家的建议(上述)。

该脚本需要添加到启动程序中,并且不需要super user特权即可运行。

#!/bin/bash
#

# Check if Wi-Fi is disabled e.g. 'out of range'
# If so quickly re-enable Wi-Fi
# Due to a problem with Broadcom proprietary driver in package firmware-b43-installer

# Script is part of Start-Up programs
# Stored in /usr/local/bin/
# Infinite loop checking every second if Wi-Fi is up and running

while true; do
  # https://askubuntu.com/questions/27954/how-can-i-check-internet-connectivity-in-a-console
  if [[ $(nmcli -f STATE -t g) != 'connected' ]]; then
    # Disable and Re-Enable Wi-Fi as the Wi-Fi is now 'out of range' (disconnected)
    nmcli radio wifi off
    nmcli radio wifi on
  fi
  sleep 1
done
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.