一部のWebサイトにpingせずにインターネット接続をテストするにはどうすればよいですか?つまり、接続はあるがサイトがダウンしている場合はどうなりますか?世界とのつながりのチェックはありますか?
一部のWebサイトにpingせずにインターネット接続をテストするにはどうすればよいですか?つまり、接続はあるがサイトがダウンしている場合はどうなりますか?世界とのつながりのチェックはありますか?
回答:
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
nc
ます。のようなものnc google.com 80 -w 10
デフォルトゲートウェイにpingを実行します。
#!/bin/bash
ping -q -w 1 -c 1 `ip r | grep default | cut -d ' ' -f 3` > /dev/null && echo ok || echo error
function ping_gw() { ... && return 0 || return 1 }
その後、次のように使用しますping_gw || (echo "no network, bye" && exit 1)
ifconfig down wlan0
たが、実際にはデフォルトのゲートウェイがあり、実際には外の世界に到達できない場合でも、pingを実行できます。
ここに投稿してくれたユーザー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
cat /sys/class/net/wwan0/carrier
のUbuntu 14.04 LTS上では動作しません。
2>/dev/null
後cat /sys/class/net/$interface/carrier
ケース・ネットワーキングのエラー出力が無効になっている必要はありませします。
その前に、telnetを使用してポート80に接続し、テキストを送信するスクリプトを作成しました。
HTTP/1.0 GET /index.html
続いて2つのCR / LFシーケンス。
何らかのHTTP応答が返されれば、通常はサイトが機能していると想定できます。
一番上の答えは、デフォルトゲートウェイへの接続が完全に安定しているという事実を見逃していますが、インターネット上で実際に到達できるという意味ではありません。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
ネットワークがTCPトラフィックの送受信を許可していることを確認してください。次のコマンドを使用して、公開IPを取得できます。
curl ifconfig.co
次のコマンドを実行して、Webサイトが稼働しているかどうか、およびWebサーバーが表示しているステータスメッセージを確認します。
$ curl -Is http://www.google.com |
head -1 HTTP/1.1 200 OK
ステータスコード「200 OK」は、リクエストが成功し、ウェブサイトにアクセスできることを意味します。
curl -Is http://www.google.com | head -1 | grep 200; if [[ $? -eq 0 ]]; then; echo "Online"; else; echo "Offline"; fi;
ローカルネームサーバーがダウンしている場合、
ping 4.2.2.1
覚えやすい常設IP(実際にはネームサーバーでもあります)です。
トップは、答えは投票 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でテスト済み
route
コマンドを変更して、route -n get default 2> /dev/null | grep gateway
オフライン時にstderrにエラーが書き込まれないようにします。
この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
最短の方法: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
@Jesseの回答と同様に、このオプションは、使用するどのソリューションよりもはるかに高速でping
、@ Jesseの回答よりもわずかに効率的かもしれません。
find /sys/class/net/ -maxdepth 1 -mindepth 1 ! -name "*lo*" -exec sh -c 'cat "$0"/carrier 2>&1' {} \; | grep -q '1'
このコマンドはfind
with -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
cat
はcarrier
、ファイルを読み取ることができないために失敗した場合でも、内容を確認してすべての出力を標準出力にリダイレクトするために使用されています。これらのファイルの中で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 &
あなたの目標が実際にインターネットアクセスをチェックすることである場合、この質問に対する既存の回答の多くに欠陥があります。注意すべき点がいくつかあります。
それを念頭に置いて、私は最良の戦略はいくつかに連絡することだと信じています、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
このアプローチに関するいくつかのメモ:
if wait $pid;
。それがシステムで機能しない理由はわかりません。bashを使用していますか?
wait
、戻りコードが実際にテストされていることを理解しました。私はあなたのコードを再コピーしました、そして今日それは機能します-おっと!何がどうしていいのか分からないけど、前回はなんとか台無しにしていたに違いない。それにもかかわらず、カルパを測定します。謝罪。
これは、ここに掲載されているどのソリューションよりも著しく高速で、特定のホストのテストにも使用できます。
秘訣は、が採用している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
}