web-dev-qa-db-ja.com

Linuxでbashスクリプトを使用してインターネットアクセスを確認する方法は?

私の学校では、インターネットは利用できません(23:0以降は毎晩学校がインターネットを殺し、私たちをベッドに入れます> .. <)。その後、パラメータping -w1 ...

つまり、ping -q -w1 -c1 8.8.8.8を使用してインターネットがアップ/ダウンしているかどうかを確認すると、単一のcatを使用しているように、出力なしでそこに存在し、終了しません。

私の質問を理解できますか?なぜこんな感じなのかわかりませんが、問題はschool-internet-serviceに関係していると思います。なにか提案を? (wgetは良い代替手段かもしれませんが、使用方法は?)

17
Libin Wen

Wgetの使用:

#!/bin/bash

wget -q --tries=10 --timeout=20 --spider http://google.com
if [[ $? -eq 0 ]]; then
        echo "Online"
else
        echo "Offline"
fi
37
Atropo

学校がすべてのトラフィックを「ベッドにいない理由」ページにリダイレクトするのではなく、実際にルーターをオフにする場合、Webページ全体をダウンロードしたり、HTTPヘッダーを送信したりする必要はありません。あなたがしなければならないのは、単に接続を行い、誰かが聞いているかどうかをチェックすることです。

nc -z 8.8.8.8 53

これにより、「8.8.8.8ポート53 [tcp/domain]への接続に成功しました!」が出力されます。誰かがリッスンしている場合、値0を返します。

シェルスクリプトで使用する場合:

nc -z 8.8.8.8 53  >/dev/null 2>&1
online=$?
if [ $online -eq 0 ]; then
    echo "Online"
else
    echo "Offline"
fi
15
Andrew
#!/bin/bash

INTERNET_STATUS="UNKNOWN"
TIMESTAMP=`date +%s`
while [ 1 ]
 do
    ping -c 1 -W 0.7 8.8.4.4 > /dev/null 2>&1
    if [ $? -eq 0 ] ; then
        if [ "$INTERNET_STATUS" != "UP" ]; then
            echo "UP   `date +%Y-%m-%dT%H:%M:%S%Z` $((`date +%s`-$TIMESTAMP))";
            INTERNET_STATUS="UP"
        fi
    else
        if [ "$INTERNET_STATUS" = "UP" ]; then
            echo "DOWN `date +%Y-%m-%dT%H:%M:%S%Z` $((`date +%s`-$TIMESTAMP))";
            INTERNET_STATUS="DOWN"
        fi
    fi
    sleep 1
 done;

出力は次のようなsmthを生成します。

bash-3.2$ ./internet_check.sh
UP   2016-05-10T23:23:06BST 4
DOWN 2016-05-10T23:23:25BST 19
UP   2016-05-10T23:23:32BST 7

行の最後の数字は、前の状態の持続時間を示します。つまり、19アップ、7秒ダウン

4
Cyril R

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

楽しい ;)

2
user3439968

タイムアウトオプション-tを使用します。

ping -q -t 5 -w1 -c1 8.8.8.8 t
2
suspectus

Fpingのインストール:> pingよりも問題が少ない。

fping google.com | grep alive

たとえば次のように使用します:

#!/bin/bash

itest=$(fping google.com | grep alive)

while [ "$itest" == "" ] 
        do
        sleep 5
        itest=$(fping google.com | grep alive)
done
echo now online
2
Lizen Kohlhaas

上記の例を使用して、接続の状態を記録する次のスクリプトを作成しました。 https://Gist.github.com/cganterh/ffc2fffa8263857cbece

まず、次のコードをname.shファイルに保存します。

#!/bin/bash

while true
do
    wget -q --tries=10 --timeout=20 -O - http://google.com > /dev/null
    if [[ $? -eq 0 ]]; then
        echo $(date) "1" | tee -a log.csv
    else
        echo $(date) "0" | tee -a log.csv
    fi
    sleep 5
done

次に、ターミナルでname.shファイルを実行し、同じフォルダーのlog.csvのログ状態情報を確認します。

2

信頼できる古いpingを別のbashスクリプトで:

#!/bin/bash
ipaddr='8.8.8.8' # Google's public DNS server
[[ -z `ping -c1 $ipaddr |& grep -o 'Network is unreachable'` ]] || exit 1
[[ -z `ping -c3 $ipaddr |& grep -o '100% packet loss'` ]] && exit 0 || exit 1

これを別のスクリプトに入れます。 異なるネットワーク状況(1)ネットワークに接続されていない、(2)ネットワークに接続されているがインターネット(または少なくともGoogle)にアクセスできない、(3)に接続されているインターネット。


後でスクリプトのexit codeを使用して接続を確認できます。

~$ script-name && echo online || echo offline
0
Majal