一部のWebサイトにpingを実行せずにインターネット接続をテストするにはどうすればよいですか? つまり、接続はあるがサイトがダウンしている場合はどうなりますか? 世界とのつながりのチェックはありますか?
20 に答える
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
デフォルト ゲートウェイに ping を実行します。
#!/bin/bash
ping -q -w 1 -c 1 `ip r | grep default | cut -d ' ' -f 3` > /dev/null && echo ok || echo error
ここに投稿してくれたユーザー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
telnet を使用してポート 80 に接続し、テキストを送信する前にスクリプトを作成しました。
HTTP/1.0 GET /index.html
その後に 2 つの CR/LF シーケンスが続きます。
なんらかの形式の HTTP 応答が返された場合、通常、サイトは機能していると見なすことができます。
ローカルのネームサーバーがダウンしている場合、
ping 4.2.2.1
覚えやすい常時接続 IP です (実際にはネームサーバーでもあります)。
Pingは、あなたが探していることを正確に実行するように設計されています。ただし、サイトがICMPエコーをブロックしている場合は、いつでも一部のサイト、wget、またはcurlのポート80にTelnetで接続できます。
別の方法として、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
Pongは、サーバー上のWebサービスが実行されていることを意味するものではありません。サーバーがICMPエコーに応答していることを意味するだけです。curlを使用して、その戻り値を確認することをお勧めします。
キャプティブ ポータルを処理する場合は、次のワンライナーを実行できます。
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
最速の結果を得るには、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