128

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

4

20 に答える 20

156

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
于 2014-11-08T18:01:49.260 に答える
97

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

#!/bin/bash
ping -q -w 1 -c 1 `ip r | grep default | cut -d ' ' -f 3` > /dev/null && echo ok || echo error
于 2009-05-31T15:04:55.757 に答える
31

ここに投稿してくれたユーザー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 上記は Ubuntu 12.04 で動作します /sys は他のディストリビューションには存在しない場合があります。下記参照:

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

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

于 2013-02-18T15:09:32.637 に答える
7

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

HTTP/1.0 GET /index.html

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

なんらかの形式の HTTP 応答が返された場合、通常、サイトは機能していると見なすことができます。

于 2009-05-30T08:50:24.113 に答える
4

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

ping 4.2.2.1

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

于 2009-05-31T02:43:52.760 に答える
2

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

于 2009-05-31T15:16:48.930 に答える
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
于 2014-12-03T18:18:47.420 に答える
1

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

于 2009-06-02T13:55:25.487 に答える
0

キャプティブ ポータルを処理する場合は、次のワンライナーを実行できます。

if [[ $(curl -s -D - http://www.gstatic.com/generate_204 2>/dev/null | head -1 | cut -d' ' -f 2) == "204" ]]; then
  echo 'online'
else
  echo 'offline'
fi

または、キャプティブ ポータルと信号の欠如を区別できる、より読みやすいものが必要な場合は、次のようにします。

function is_online() {
  # Test signal
  local response
  response=$(curl --silent --dump-header - http://www.gstatic.com/generate_204 2> /dev/null)
  if (($? != 0)); then return 2; fi
  # Test captive portal
  local status=$(echo $response | head -1 | cut -d' ' -f 2)
  ((status == "204"))
}
is_online && echo online || echo offline
于 2021-04-21T15:32:16.930 に答える
0

最速の結果を得るには、DNS サーバーに ping を実行します

ping -c1 "8.8.8.8" &>"/dev/null"

if [[ "${?}" -ne 0 ]]; then
    echo "offline"
elif [[ "${#args[@]}" -eq 0 ]]; then
    echo "online"
fi

スタンドアロン コマンドとして利用可能: linkStatus

于 2019-10-13T21:57:46.160 に答える