[英]How to check internet access using bash script in linux?
在我的學校,互聯網不可用(每天晚上23:0之后學校會殺死互聯網,讓我們躺在床上>..<),然后ping永遠不會停止,盡管我使用了參數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
如果學校實際上關閉了他們的路由器而不是將所有流量重定向到“你為什么不在床上”頁面,那么就不需要下載整個網頁或發送 HTTP 標頭。 您所要做的就是建立連接並檢查是否有人在聽。
nc -z 8.8.8.8 53
這將輸出“連接到 8.8.8.8 端口 53 [tcp/domain] 成功!” 如果有人在聽,則返回值 0。
如果要在 shell 腳本中使用它:
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 秒下
使用超時選項-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
中的日志狀態信息。
沒有 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
享受;)
我決定結合上面的一些,以便我以后可以創建一個顯示起伏和持續時間的圖:
#!/bin/bash
#
# pinger is a bash shell script that monitors the network
# status every 15 seconds and records if it is up '1' or down '0'
# into the file log.csv from whence it may be plotted.
#
# author: J. W. Wooten, Ph.D.
# since: 11/12/2019
# version: 1.0
#
TIMESTAMP=`date +%s`
while [ 1 ]
do
nc -z -w 5 8.8.8.8 53 >/dev/null 2>&1
online=$?
TIME=`date +%s`
if [ $online -eq 0 ]; then
echo "`date +%Y-%m-%d_%H:%M:%S_%Z` 1 $(($TIME-$TIMESTAMP))" | tee -a log.csv
else
echo "`date +%Y-%m-%d_%H:%M:%S_%Z` 0 $(($TIME-$TIMESTAMP))" | tee -a log.csv
fi
TIMESTAMP=$TIME
sleep 15
done;
這每 15 秒輸出到一個 csv 文件。 使用 Excel 或 Numbers,您可以讀取文件並創建一個圖表,該圖表將顯示互聯網何時不可用以及持續時間。 如果它從您的睡眠間隔發生變化,那么它正在花時間嘗試連接。 希望添加在接下來檢測到網絡中斷時向我發送文本的功能。 感謝以上所有。
上述 Majal 解決方案的一個變體只是測試 ping 的返回代碼,如果站點響應,則返回 0,如果沒有回復,則返回 1,如果網絡無法訪問則返回 2。
ping -c 1 -t 5 8.8.8.8 2&>1
rc=$?
[[ $rc -eq 0 ]] && { echo "Connected to the Internet" ; exit 0 ; } \
|| [[ $rc -eq 1 ]] && { echo "No reply from Google DNS" ; exit 1 ; } \
|| [[ $rc -eq 2 ]] && { echo "Network unreachable" ; exit 2 ; }
使用ping的好處是不需要下載任何東西,提高了測試的速度。
ping
:#!/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)連接到網絡但無法訪問互聯網(或至少是谷歌),以及(3)連接到互聯網。
您可以稍后使用腳本的exit code
來檢查連接性,例如
~$ script-name && echo online || echo offline
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.