web-dev-qa-db-ja.com

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

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

97
lauriys

pingなし

#!/bin/bash

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

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

-q:無音モード

-spider:取得せず、ページの可用性を確認するだけです

$?:シェルのリターンコード

:シェル「すべて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
111
user3439968

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

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

ユーザーへの感謝somedrewこちらの投稿: https://bbs.archlinux.org/viewtopic.php?id=55485 on 2008-09-20 02:09 :48

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

ループバック以外のネットワーク接続をテストするためのスクリプトを次に示します。ウェブサイトにアクセスできるかどうかを定期的にテストするために、別のスクリプトで以下を使用します。アクセスできない場合は、ポップアップウィンドウが表示され、問題を警告します。

以下のスクリプトは、ラップトップがネットワークに接続されていない場合、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は、接続をテストすることを目的としているため、ここで使用するのに最適なものではないと感じています特定のホストへ接続があるかどうかテストしませんネットワークへ

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

現代のLinuxディストリビューションには、仮想ファイルシステムとしての/ sysディレクトリ(syscf、procfsに相当する/ procに相当)が含まれています。カーネルソースツリーへのシンボリックリンクとしての/ sys。[要出典]

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

27
Jesse

これはMacOSXとLinuxの両方で動作します:

#!/bin/bash

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

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

HTTP/1.0 GET /index.html

その後に2つのCR/LFシーケンスが続きます。

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

7
paxdiablo

一番上の答えは、デフォルトゲートウェイへの完全に安定した接続を確立できるという事実を見逃していますが、それは実際にインターネット上の何かに実際にアクセスできるということを意味しません。 OPは、世界とのつながりをどのようにテストできるかを尋ねます。したがって、ゲートウェイIPをLANの外部にある既知のIP(x.y.z.w)に変更することにより、トップアンサーを変更することをお勧めします。

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

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
7
Fuwan

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

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

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

5

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

 ping 4.2.2.1 

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

4
ephemient

ネットワークがTCPトラフィックの出入りを許可していることを確認してから、次のコマンドでパブリックIPを取り戻すことができます。

curl ifconfig.co
4
WaiKit Kung

上位投票の回答 はMacOSでは機能しないため、Macを使用している場合は、これを正常にテストしました。

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でテスト済み

3
Francisc0

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

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

特定のWebサイトではなく、任意の public dns を使用できます。

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

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

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

3

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
dm76

@ Jesse's answer と同様に、このオプションはpingを使用するソリューションよりもはるかに高速で、おそらく @ Jesse's answer よりもわずかに効率的です。

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

説明:

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

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

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

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

最初のオプションは @ Jesse's answer で処理されません。削除されるshコマンドは次のとおりです。

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

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

使用法

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

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 &

参照

2
Doron Behar

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

2
nikudesu

この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
2

Bashでは、ネットワークラッパーを使用して/ dev / {dptcp} /Host/port

if echo -n >/dev/tcp/8.8.8.8/53; then
  echo 'Internet available.'
else
  echo 'Offline.'
fi
2
Luchostein

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

1
tomoe

インターネットアクセスを実際に確認することが目標である場合、この質問に対する既存の回答の多くに欠陥があります。知っておくべきいくつかのこと:

  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を返します。ほとんどの場合、これは合理的なことです
0
Ajedi32