一部のWebサイトにpingを実行せずにインターネット接続をテストするにはどうすればよいですか?つまり、接続はあるがサイトがダウンしている場合はどうなりますか?世界とのつながりのチェックはありますか?
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
デフォルトゲートウェイに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つの方法です。
ループバック以外のネットワーク接続をテストするためのスクリプトを次に示します。ウェブサイトにアクセスできるかどうかを定期的にテストするために、別のスクリプトで以下を使用します。アクセスできない場合は、ポップアップウィンドウが表示され、問題を警告します。
以下のスクリプトは、ラップトップがネットワークに接続されていない場合、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
これはMacOSXとLinuxの両方で動作します:
#!/bin/bash
ping -q -w1 -c1 google.com &>/dev/null && echo online || echo offline
私はそれ以前に単にtelnetを使用してポート80に接続し、テキストを送信するスクリプトを作成しました。
HTTP/1.0 GET /index.html
その後に2つのCR/LFシーケンスが続きます。
何らかの形式のHTTP応答が返されれば、通常はサイトが機能していると想定できます。
一番上の答えは、デフォルトゲートウェイへの完全に安定した接続を確立できるという事実を見逃していますが、それは実際にインターネット上の何かに実際にアクセスできるということを意味しません。 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
次のコマンドを実行して、Webサイトが稼働しているかどうか、およびWebサーバーが表示しているステータスメッセージを確認します。
$ curl -Is http://www.google.com |
head -1 HTTP/1.1 200 OK
ステータスコード「200 OK」は、リクエストが成功し、ウェブサイトに到達できることを意味します。
ローカルネームサーバーがダウンしている場合、
ping 4.2.2.1
覚えやすい常時接続IPです(実際にはネームサーバーでもあります)。
ネットワークがTCPトラフィックの出入りを許可していることを確認してから、次のコマンドでパブリックIPを取り戻すことができます。
curl ifconfig.co
上位投票の回答 は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でテスト済み
最短の方法: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
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
@ 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
の終了コードが最終的な終了コードになります。
たとえば、このコマンドの終了ステータスを使用すると、インターネット接続がある場合にのみ、~/.xprofile
で gnubiff を開始できます。
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 &
Pingは、あなたがしたいことを正確に行えるように設計されています。ただし、サイトがICMPエコーをブロックする場合は、いつでもサイト、wget、またはcurlのポート80にTelnetを実行できます。
この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
Bashでは、ネットワークラッパーを使用して/ dev / {dp、tcp} /Host/port:
if echo -n >/dev/tcp/8.8.8.8/53; then
echo 'Internet available.'
else
echo 'Offline.'
fi
Pongは、サーバー上のWebサービスが実行されていることを意味しません。サーバーがICMPエコーに応答していることを意味するだけです。 curlを使用して、その戻り値を確認することをお勧めします。
インターネットアクセスを実際に確認することが目標である場合、この質問に対する既存の回答の多くに欠陥があります。知っておくべきいくつかのこと:
それを念頭に置いて、最善の戦略は、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
このアプローチに関する注意事項: