私の学校では、インターネットは利用できません(23:0以降は毎晩学校がインターネットを殺し、私たちをベッドに入れます> .. <)。その後、パラメータping -w1 ...
。
つまり、ping -q -w1 -c1 8.8.8.8
を使用してインターネットがアップ/ダウンしているかどうかを確認すると、単一のcat
を使用しているように、出力なしでそこに存在し、終了しません。
私の質問を理解できますか?なぜこんな感じなのかわかりませんが、問題はschool-internet-serviceに関係していると思います。なにか提案を? (wget
は良い代替手段かもしれませんが、使用方法は?)
Wgetの使用:
#!/bin/bash
wget -q --tries=10 --timeout=20 --spider http://google.com
if [[ $? -eq 0 ]]; then
echo "Online"
else
echo "Offline"
fi
学校がすべてのトラフィックを「ベッドにいない理由」ページにリダイレクトするのではなく、実際にルーターをオフにする場合、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
#!/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秒ダウン
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
楽しい ;)
タイムアウトオプション-t
を使用します。
ping -q -t 5 -w1 -c1 8.8.8.8 t
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
上記の例を使用して、接続の状態を記録する次のスクリプトを作成しました。 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
のログ状態情報を確認します。
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