bashでインターネット接続をテストする方法は?


113

一部のWebサイトにpingせずにインターネット接続をテストするにはどうすればよいですか?つまり、接続はあるがサイトがダウンしている場合はどうなりますか?世界とのつながりのチェックはありますか?


2
複数の異なるサイトにpingしますか?

1
しかし、私はウェブサイトにpingを送りたくありません、他に選択肢はありませんか?
ラウリーズ2009年

6
たぶん他の方法があることを確認したいだけです!
ラウリーズ2009年

2
一度にオフラインにならないことがわかっているアドレスのセットに対して単一のパケットを送受信するよりも良い方法はありません。別の方法は、アプリケーションがより多くのパブリックにpingを送信したくない場合に、現在設定されているDNSを確認することですドメイン。
Tamara Wijsman、2009年

14
誰かが音を出さずに聞いているのか知りたい!
Kaz

回答:


131

pingなし

#!/bin/bash

wget -q --spider http://google.com

if [ $? -eq 0 ]; then
    echo "Online"
else
    echo "Offline"
fi

-q:無音モード

--spider:取得せず、ページの可用性を確認してください

$?:シェルの戻りコード

0:シェル「すべてOK」コード

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

2
とても素敵です...もちろん、ボックスにwgetがあることを前提としています。組み込みデバイスとはおそらくないでしょう。;)
Eric Sebasta 2015年

5
これを試してください:echo -e "GET google.com HTTP / 1.0 \ n \ n" | nc google.com 80> / dev / null 2>&1
user3439968

1
ここではtcpingも役に立ちます。(tcping www.yahoo.com 80)&& echo「Site is up」
David Ramirez

ここでif / elseステートメントを使用すると、説明が素晴らしいです。ありがとうございました !
Danijel-James W

1
@ user3439968タイムアウトになるようにタイムアウトを追加する必要がありncます。のようなものnc google.com 80 -w 10
カプタン

93

デフォルトゲートウェイにpingを実行します。

#!/bin/bash
ping -q -w 1 -c 1 `ip r | grep default | cut -d ' ' -f 3` > /dev/null && echo ok || echo error

14
優れた手法で、関数で使用するように変更できます。function ping_gw() { ... && return 0 || return 1 }その後、次のように使用しますping_gw || (echo "no network, bye" && exit 1)
。– memnoch_proxy

1
Mac OSでは、これはcopy-pasteを介して機能しません: "-bash:ip:コマンドが見つかりませんping:不正なオプション-w"
Benedikt S. Vogler

1
ホストが接続されていないときに仮想化ゲストから実行すると、誤った警告が表示されます。
テレサeジュニア

1
エレメンタリーOS(0.4.1、Acer Aspire E 15)の偽陰性を表示します
Malcolm

1
これに注意してください。私はこれをテストすることでテストしましifconfig down wlan0たが、実際にはデフォルトのゲートウェイがあり、実際には外の世界に到達できない場合でも、pingを実行できます。
Bruno Bronosky

29

ここに投稿してくれたユーザーsomedrewに大変感謝します:https : //bbs.archlinux.org/viewtopic.php?id=55485 on 2008-09-20 02:09:48

/ sys / class / netを調べることは1つの方法であるべきです

ループバック以外のネットワーク接続をテストするスクリプトは次のとおりです。私は自分のWebサイトがアクセス可能かどうかを定期的にテストするために持っている別のスクリプトで以下を使用しています。アクセスできない場合は、ポップアップウィンドウが表示され、問題が発生します。

以下のスクリプトでは、ラップトップがネットワークに接続されていない場合は、5分ごとにポップアップメッセージを受信できません。

#!/usr/bin/bash

# Test for network conection
for interface in $(ls /sys/class/net/ | grep -v lo);
do
  if [[ $(cat /sys/class/net/$interface/carrier) = 1 ]]; then OnLine=1; fi
done
if ! [ $OnLine ]; then echo "Not Online" > /dev/stderr; exit; fi

bashを初めて使用する方への注意:最後の「if」ステートメントは、NOT [!]がオンラインかどうかをテストし、そうである場合は終了します。詳細については、man bashを参照し、「式を組み合わせることができる」を検索してください。

PS pingは、特定のホストへの接続テストすることを目的としているため、ここで使用するのは最善の方法ではないと思います。何らかのネットワークへの接続があるかどうかはテストしません。

PPS The AboveはUbuntu 12.04で動作します/ sysは他のディストリビューションでは存在しない場合があります。下記参照:

最新のLinuxディストリビューションには、仮想ファイルシステム(sysfs、/ procfsである/ procに相当)として/ sysディレクトリが含まれています。これは、システムに接続されたデバイスを保存および変更できるのに対し、多くの従来のUNIXおよびUnixのようなオペレーティングシステムではカーネルソースツリーへのシンボリックリンクとしての/ sys。[引用が必要]

ウィキペディアからhttps://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard


1
今慎重に「!cat /sys/class/net/wwan0/carrierのUbuntu 14.04 LTS上では動作しません。
dotnetCarpenter

1
あなたは置きたくて2>/dev/nullcat /sys/class/net/$interface/carrierケース・ネットワーキングのエラー出力が無効になっている必要はありませします。
jarno 2016年

25

これはMacOSXとLinuxの両方で機能します。

#!/bin/bash

ping -q -w1 -c1 google.com &>/dev/null && echo online || echo offline

osx(ping: invalid option -- w)を除く
avishayp

fping google.comまたは単にfping 8.8.8.8ボーナスでマジックを実行し、テストする必要がないステータスコード( " google.com is alive")...
Roger

9

Bashでは、/ dev / { udptcp } / host / portを介してネットワークラッパーを使用します

if : >/dev/tcp/8.8.8.8/53; then
  echo 'Internet available.'
else
  echo 'Offline.'
fi

:接続をテストしたいだけで処理はしたくないので、Bashは何もしません。)


7

その前に、telnetを使用してポート80に接続し、テキストを送信するスクリプトを作成しました。

HTTP/1.0 GET /index.html

続いて2つのCR / LFシーケンス。

何らかのHTTP応答が返されれば、通常はサイトが機能していると想定できます。


3
なぜ車輪を再発明するのですか?curlとwgetの両方がこれを完全に実行します。
Adam Rosenfield、

6
wgetとcurlが常に使用できるとは限らないため(たとえば、企業環境での制限)。Telnetは、t = 0以降のすべてのUNIXの標準的な部分です。
paxdiablo 2009年

ええ、Telnetはかなり長い間、接続をテストするためのかなり標準的な方法でした。
PTBNL

2
wgetはかなり一般的ですが、良い点です。もう1つのオプションはnetcat(nc)ですが、この場合はtelnetよりも改善されていません。
Adam Rosenfield、

7

一番上の答えは、デフォルトゲートウェイへの接続が完全に安定しているという事実を見逃していますが、インターネット上で実際に到達できるという意味ではありません。OPは、世界との接続をテストする方法を尋ねます。そのため、ゲートウェイIPをLANの外部にある既知のIP(xyzw)に変更して、トップの回答を変更することをお勧めします。

したがって、答えは次のようになります。

ping -q -w 1 -c 1 x.y.z.w > /dev/null && echo ok || echo error

また、コマンド置換のために不利なバックティックを削除します[1]

いくつかのコードを実行する前に世界に接続していることを確認したいだけの場合は、次の方法も使用できます。

if ping -q -w 1 -c 1 x.y.z.w > /dev/null; then
    # more code
fi

6

ネットワークがTCPトラフィックの送受信を許可していることを確認してください。次のコマンドを使用して、公開IPを取得できます。

curl ifconfig.co

5

次のコマンドを実行して、Webサイトが稼働しているかどうか、およびWebサーバーが表示しているステータスメッセージを確認します。

$ curl -Is http://www.google.com | head -1 HTTP/1.1 200 OK

ステータスコード「200 OK」は、リクエストが成功し、ウェブサイトにアクセスできることを意味します。


2
より良い実装はcurl -Is http://www.google.com | head -1 | grep 200; if [[ $? -eq 0 ]]; then; echo "Online"; else; echo "Offline"; fi;
Luca Galasso

4

ローカルネームサーバーがダウンしている場合、

ping 4.2.2.1

覚えやすい常設IP(実際にはネームサーバーでもあります)です。


5
ping 8.8.8.8(Google NS)
user3439968 2014年

4

トップは、答えは投票 Mac上でそれらのために、私はこれを正常にテストしてみたので、MacOSのための仕事をしません。

GATEWAY=`route -n get default | grep gateway`
if [ -z "$GATEWAY" ]
  then
    echo error
else
  ping -q -t 1 -c 1 `echo $GATEWAY | cut -d ':' -f 2` > /dev/null && echo ok || echo error
fi

MacOS High Sierra 10.12.6でテスト済み


2
routeコマンドを変更して、route -n get default 2> /dev/null | grep gatewayオフライン時にstderrにエラーが書き込まれないようにします。
devstuff

4

このbashスクリプトはインターネットを継続的にチェックし、インターネットが利用可能になるとビープ音を鳴らします。

#!/bin/bash
play -n synth 0.3 sine 800 vol 0.75
while :
do
pingtime=$(ping -w 1 8.8.8.8 | grep ttl)
if [ "$pingtime" = "" ] 
then 
   pingtimetwo=$(ping -w 1 www.google.com | grep ttl) 
   if [ "$pingtimetwo" = "" ] 
   then 
       clear ; echo 'Offline'
   else
       clear ; echo 'Online' ; play -n synth 0.3 sine 800 vol 0.75
   fi 
else
    clear ; echo 'Online' ; play -n synth 0.3 sine 800 vol 0.75
fi
sleep 1
done

3

最短の方法:fping 4.2.2.1=>「4.2.2.1は生きている」

これpingはよりも高速で詳細な出力が少ないため、これを選択します。欠点は、インストールする必要があることです。

特定のWebサイトではなく、任意のパブリックDNSを使用できます。

fping -q google.com && echo "do something because you're connected!"

-q 終了コードを返すので、オンラインで何かを実行している例を示しています。

Macにインストールするには:brew install fping; Ubuntuで:sudo apt-get install fping


2

Pingは、ユーザーが望んでいることを正確に実行するように設計されています。ただし、サイトがICMPエコーをブロックしている場合は、いつでも、特定のサイト、wget、またはcurlのポート80にTelnetを実行できます。


2

Googleのインデックスページを確認することも、別の方法です。

#!/bin/bash

WGET="/usr/bin/wget"

$WGET -q --tries=20 --timeout=10 http://www.google.com -O /tmp/google.idx &> /dev/null
if [ ! -s /tmp/google.idx ]
then
    echo "Not Connected..!"
else
    echo "Connected..!"
fi

2

@Jesseの回答と同様に、このオプションは、使用するどのソリューションよりもはるかに高速でping@ Jesseの回答よりもわずかに効率的かもしれません。

find /sys/class/net/ -maxdepth 1 -mindepth 1 ! -name "*lo*" -exec sh -c 'cat "$0"/carrier 2>&1' {} \; | grep -q '1'

説明:

このコマンドはfindwith -execを使用して*lo*、で指定されていないすべてのファイルに対してコマンドを実行します/sys/class/net/。これらは、マシンで使用可能なネットワークインターフェイスに関する情報を含むディレクトリへのリンクである必要があります。

実行されるshコマンドは、carrierそれらのディレクトリ内のファイルの内容を確認するコマンドです。の値に$interface/carrierは3つの意味があります- 引用

3つの状態があるようです:

  • ./carrierが読み取り可能ではありません(たとえば、Network Managerでインターフェースが無効になっている場合)。
  • ./carrierには "1"が含まれています(インターフェースがアクティブで、WiFiネットワークに接続されている場合)
  • ./carrierには "0"が含まれています(インターフェースがアクティブで、WiFiネットワークに接続されていない場合)

@Jesseの回答では、最初のオプションは考慮されていません。shアウト縞模様のコマンドは次のとおりです。

# Note: $0 == $interface
cat "$0"/carrier 2>&1

catcarrier、ファイルを読み取ることができないために失敗した場合でも、内容を確認してすべての出力を標準出力にリダイレクトするために使用されています。これらのファイルの中でgrep -q見つかった場合"1"、少なくとも1つのインターフェースが接続されていることを意味します。の終了コードがgrep -q最終的な終了コードになります。

使用法

たとえば、このコマンドの終了ステータスを使用すると、インターネットに接続している場合にのみgnubiffを開始できます~/.xprofile

online() {
    find /sys/class/net/ -maxdepth 1 -mindepth 1 ! -name "*lo*" -exec sh -c 'cat "$0"/carrier 2>&1 > /dev/null | grep -q "1" && exit 0' {} \;
}
online && gnubiff --systemtray --noconfigure &

参照


1

Pongは、サーバー上のWebサービスが実行されていることを意味しません。これは単に、サーバーがICMPエコーに応答していることを意味します。curlを使用して戻り値を確認することをお勧めします。


0

あなたの目標が実際にインターネットアクセスをチェックすることである場合、この質問に対する既存の回答の多くに欠陥があります。注意すべき点がいくつかあります。

  1. コンピューターがネットワークに接続されている可能性があります。そのネットワークはインターネットにアクセスできません。
  2. インターネット全体にアクセスできなくてもサーバーがダウンする可能性があります
  3. インターネットにアクセスできない場合でも、キャプティブポータルが任意のURLのHTTP応答を返す可能性があります

それを念頭に置いて、私は最良の戦略はいくつかに連絡することだと信じています、HTTPS接続を介してサイトに接続し、それらのサイトのいずれかが応答した場合にtrueを返すます。

例えば:

connected_to_internet() {
  test_urls="\
  https://www.google.com/ \
  https://www.microsoft.com/ \
  https://www.cloudflare.com/ \
  "

  processes="0"
  pids=""

  for test_url in $test_urls; do
    curl --silent --head "$test_url" > /dev/null &
    pids="$pids $!"
    processes=$(($processes + 1))
  done

  while [ $processes -gt 0 ]; do
    for pid in $pids; do
      if ! ps | grep "^[[:blank:]]*$pid[[:blank:]]" > /dev/null; then
        # Process no longer running
        processes=$(($processes - 1))
        pids=$(echo "$pids" | sed --regexp-extended "s/(^| )$pid($| )/ /g")

        if wait $pid; then
          # Success! We have a connection to at least one public site, so the
          # internet is up. Ignore other exit statuses.
          kill -TERM $pids > /dev/null 2>&1 || true
          wait $pids
          return 0
        fi
      fi
    done
    # wait -n $pids # Better than sleep, but not supported on all systems
    sleep 0.1
  done

  return 1
}

使用法:

if connected_to_internet; then
  echo "Connected to internet"
else
  echo "No internet connection"
fi

このアプローチに関するいくつかのメモ:

  1. 上記で概説したすべての偽陽性と陰性に対して堅牢です
  2. 速度を最大化するために、すべての要求が並行して行われます
  3. 技術的にインターネットにアクセスできるが、DNSが機能していないか、ネットワーク設定が混乱している場合はfalseを返します。

curlからの戻りコードはテストされていません。私のシステムでは、ネットワークが利用できない場合、curlはrc = 6(DNS解決に失敗)を返しますが、このコードは「インターネットに接続されました」と報告します。
ceperman

@ceperman curlの戻りコードは、その行でテストされますif wait $pid;。それがシステムで機能しない理由はわかりません。bashを使用していますか?
Ajedi32

@ceperman別の可能性。おそらく、一番上のリストのURLの1つは、他の名前解決に失敗しても、実際に成功を返しますか?
Ajedi32

2
私のbashはかなり基本的なので、読み返してwait、戻りコードが実際にテストされていることを理解しました。私はあなたのコードを再コピーしました、そして今日それは機能します-おっと!何がどうしていいのか分からないけど、前回はなんとか台無しにしていたに違いない。それにもかかわらず、カルパを測定します。謝罪。
ceperman


-1

これは、ここに掲載されているどのソリューションよりも著しく高速で、特定のホストのテストにも使用できます。

秘訣は、が採用しているDNSソルバーよりもビジーでないDNSソルバーを使用してIPを解決することpingです。

validateConnection () {
    host="${1}"
    ip=$(getent ahostsv4 "${host}" | awk '{ print $1 }' | head -n1)
    ping -c1 "${ip}" 2>&1 >"/dev/null"

    if [ "${?}" -ne 0 ]; then
        echo "No connection to: ${host}" >&2
        exit 1
    fi
}

2
このリンクで質問に答えることができますが、回答の重要な部分をここに含め、参照用のリンクを提供することをお勧めします。リンクされたページが変更されると、リンクのみの回答が無効になる可能性があります。- レビューから
David Buck

この特定の状況には適用されません。
Alberto Salvia Novella
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.