簡體   English   中英

如何在linux中使用bash腳本檢查互聯網訪問?

[英]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的好處是不需要下載任何東西,提高了測試的速度。

單獨的 bash 腳本中可靠的舊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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM