コンソールでインターネット接続を確認するにはどうすればよいですか?


31

コンソールからインターネット接続を確認する簡単な方法はありますか?シェルスクリプトで遊んでいます。インターネット接続が正常に機能しているかどうかを解釈するために、HTTP応答コードを確認することを考えています。しかし、クラッシュしないサイトをチェックする必要のない簡単な方法があるはずだと思います;)wget --spider http://www.google.co.in/

編集:個別に調査できる多くの要因があるように思えますが、良いことです。現時点での私の意図は、ブログがダウンしているかどうかを確認することです。cronを毎分確認するようにセットアップしています。このために、ブログのwget --spiderのHTTP応答コードを確認しています。200ではない場合、通知されます(サイトに負荷がかかり、タイムアウトまたは応答が非常に遅くなる可能性があるため、pingを実行するよりも優れていると思います)。昨日、インターネットに問題がありました。LANは正常に接続されましたが、サイトにアクセスできませんでした。スクリプトが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

この方法では、ブログの応答コードに問題がある場合にのみインターネット接続を確認する必要があります。(pingを使用していないので)少し重いですが、誤検出はありません。右?また、facebook、google、yahooなどのように、毎回異なるサイトへのpingをランダム化する方法もあります。その後、サイトが停止するまでチェックをスキップするか、より長いチェックを実行します(毎分ではなく10分)。どう思いますか?


「インターネット接続」には明確な定義がありません。特定のサービスまたはサービスセットへの接続のみをテストできます。「LAN」接続を意味する場合、ネットワークゲートウェイに対してpingを実行することをお勧めします。
ジョアンピント

素人の言葉で言えば、インターネットにアクセスできるのであれば、インターネット接続を定義します。問題はその間の何でも可能です。うまく機能するのか、責任のある問題のセットに問題があるのか​​を区別する必要があります。自分自身を明確にしたいと思います。:)
アシュフェイム

回答:


29

特定のWebサイトが稼働しているかどうかを確認する

まず、複数の優れたオンライン監視サービスが利用可能です。1つを選択するために、Pingdomには1つのターゲットを監視するための無料アカウントが含まれています。(免責事項:私は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など)で実行し、リターンコードをチェックして、到達可能な宛先があるかどうかを判断できます。変数を使用して、戻りコードを自動的に確認できます$?。パラメーター-c1は、pingパケットの数を1つに制限しています。

すべてのpingおよびHTTP要求をリダイレクトするログインゲートウェイがある場合、一部のパブリックwifiで問題が発生する場合があります。その場合、他のサイトにアクセスできない場合でも、ping応答とエラー以外のHTTPステータスコードを受け取ることがあります。

ケーブルの状態を確認する場合は、次を使用できます。

sudo ethtool eth0

出力から(抜粋):

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

ただし、これは実際に接続があるかどうかではなく、ケーブルが接続されていて、何かがもう一方の端にあるかどうかだけではありません。


これは完全に私のセットアップ用で、Always-ON Ethernetで動作します。しかし、場合によっては正しく動作しないことを指摘してくれて嬉しいです。また、pingはwgetよりも高速だと思います。どう思いますか?そして、どこかで200のステータスコードをチェックしている場合は、単にpingするだけです。右?または私が知っておくべきことがありますか?
アシュフェイム

2
pingはより速く、より良いです。なぜなら、相手はあなたに腹を立てないからです。pingは非常に安全ですが、それでもWebページを開くことができるとは限りません。また、ファイアウォールがpingをブロックしているが、HTTP要求を許可している可能性があります。
オッリ

1
4.2.2.2のようなよく知られているDNSサーバーへのpingは、ネット接続はあるがDNSが壊れている場合にも役立ちます。
djeikyb

DNSチェックには、もちろんhost(DNSクエリ)を使用できます。また、非常に高速です。
-Olli

あなたの応答@Olli&Iは質問を更新しました@djeikybためのおかげで、見てください
Ashfame

7

私はこの方法を使用しています...

if [["$(ping -c 1 8.8.8.8 | grep '100%packet loss')"!= ""]]; それから
    echo "インターネットは存在しません"
    1番出口
他に
    echo "インターネットが存在します"
    wget www.site.com
fi

私はのために異なる結果を得たping -c 1 8.8.8.8ping -c 1 www.google.com。どう?
MERose

2
これはブロックGoogleのこと、中国や他の国では失敗することに注意してください
トム・J Nowell

7

使ったばかり

nm-online

ネットワーク管理者がネットワーク接続を確立するまで一時停止します。うまくいった。他のこともできます。


6

通常、サイトが稼働しているかどうかの確認は、などの監視ツールを使用して行われますnagios。これにより、サイトが継続的に監視され、停止が通知されます。

コマンドラインからインターネットが起動しているかどうかを確認するとき、いくつかの手順を実行します。

  • インターネットがping google.com稼働していることを確認します(DNSおよび既知の到達可能なサイトを確認します)。
  • Webサイトが使用中であることを確認するwgetw3m、ページを取得します。

インターネットが稼働していない場合は、外側を診断します。

  • ゲートウェイがping可能であることを確認してください。(ゲートウェイアドレスのifconfigを確認します。)
  • DNSサーバーがping可能であることを確認してください。(アドレスについては/etc/resolv.confを確認してください。)
  • ファイアウォールがブロックしているかどうかを確認します。(ブロックを記録するときに/ var / log / syslogを確認してください。)

インターネットがアップしているがサイトがダウンしている場合は、ダウンしているサイトにw3m http://isup.me/example.com置き換えて確認example.comします。wget、lynx、またはw3mブラウザーがインストールされていない場合に使用可能なコマンドラインブラウザーを使用します。


ご提案ありがとうございます!私のスクリプトは、サイトがダウンしたときに確認して警告するという基本的な要件をカバーしていますか?インターネット接続の問題がある場合は静かになります
-Ashfame

あなたのスクリプトはあなたが望むことをするようです。ifステートメントにwgetコマンドを含めることができますif ! wget --spider http:///example.com; then
-BillThor

つまり、wgetは常に200 HTTP応答コードに対して1を返しますか?
アシュフェイム

テスト[ $? != 0 ]はテストと同じ! commandです。wgetは、成功した場合に0を返し、失敗した場合に0を返さないように文書化されています。ifは、コーディングの方法にかかわらず同じように動作します。wgetが200応答で失敗を返した場合、テストは書き込み方法にかかわらず失敗します。200以外の応答コードに対して0を返す場合も同じです
。– BillThor

ありがとう!これにより、スクリプトが小さくなり、理解しやすくなります。
アシュフェイム

4

これは、インターネット接続のテストに使用しているシェルsrcriptです。

alarm.sh

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

可聴アラーム機能が必要な場合は、同じフォルダー内でalarm.mp3に名前変更された.mp3サウンドファイルが必要です。最後に、必要に応じてWebサイトのURLとegrepを構成します。


。これは、ユーザーがキャプティブポータルの背後にあるとログインしていない場合でも、完璧に動作します
Ashharハサン

次のegrep -q代わりに使用できますegrep ... > /dev/null
wjandrea

whileループを使用するのではなく、なぜスクリプトがそれ自体を呼び出すのですか?
-wjandrea

ああ待って、それは自分自身を呼び出しません。alarm.shwdで呼び出されるスクリプトを呼び出すため、別のディレクトリからこのスクリプトを呼び出すとエラーが発生するかalarm.sh、wdで呼び出されるスクリプトがある場合は代わりに呼び出します。それは悪い習慣です。"$0"代わりに使用できますが、whileループの方が良いでしょう。
-wjandrea

「なぜwhileループを使用するのではなく、スクリプトがそれ自体を呼び出すのですか?」:その投稿をしたときに私は初心者であり、はい、そのスクリプトはそれ自体を呼び出していたからです。
01BTC10

2

インターネットが機能しているかどうかを確認する

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

出力から(抜粋):

1 #System is connected to internet

ただし、他の人が述べたように、これは本当に接続性があるかどうかを示していません。例えば。ルーターに接続でき、ルーターは必ずしもインターネットに接続されているとは限りません。


2
nm-toolUbuntu 15.04+で削除されましたが、nmcli代わりに使用できます。例[[ $(nmcli -f STATE -t g) = connected ]]
6

@Six nmcli -f STATE -t nmの良い点は、Webサイトから独立していることです!
アクエリアスパワー

1
ことを注意nm-toolしてnmcli、あなたがに接続しているだけかどうかを教えてくれますローカルネットワーク、すなわちあなたの家の無線LAN /イーサネットに接続しているかどうか。ローカルネットワーク、つまりインターネットを超えて何かにアクセスできるかどうかはわかりません。
セルギー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

有名なWebサイトに接続しようとします。接続できる場合は、インターネットがあると想定します。


0

私は同じ質問で助けが必要でした、そして、私はこの方法で私の答えを得ました:

echo $(nm-online) $? connection problems

これはどのように作動しますか?
-wjandrea

nm-onlineコマンドのステータス(1文字)をチェックしているだけです...すべてが正常であれば、0を返します。すべてのUNIXシェルで通常。
アントニオ

0

インターネットが機能しているかどうかを確認することはそれほど簡単ではありません。pingはICMPであるため、Webプロキシがダウンしていても機能する場合があります。IPでテストすると、DNSでも同様のことが起こります。

私のインターネット接続は不安定であるため、私はこのスクリプト(これに基づいて)を作成し、優しいコード音で電話をかけ、またインターネット接続が戻ったときに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フォルダーに次の内容のinitスクリプトを作成します(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接続のランダムなドロップに直面しました。インターネットWi-Fi接続が稼働中であるかどうかを毎秒チェックする次のbashスクリプト(無限ループ)を考案しました。ここで提案されている他のコマンドラインは、ステータスで終了する前に少なくとも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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.