Làm cách nào để kiểm tra kết nối Internet trong bảng điều khiển?


31

Có cách nào dễ dàng để kiểm tra kết nối Internet từ bàn điều khiển không? Tôi đang cố gắng để chơi xung quanh trong một kịch bản shell. Một ý tưởng tôi dường như là và kiểm tra mã phản hồi HTTP để giải thích nếu kết nối Internet hoạt động tốt. Nhưng tôi nghĩ rằng phải có cách dễ dàng mà không cần kiểm tra một trang web không bao giờ bị sập;)wget --spider http://www.google.co.in/

Chỉnh sửa: Có vẻ như có thể có rất nhiều yếu tố có thể được kiểm tra riêng lẻ, điều tốt. Ý định của tôi lúc này là kiểm tra xem blog của tôi có bị hỏng không. Tôi đã thiết lập cron để kiểm tra nó mỗi phút. Đối với điều này, tôi đang kiểm tra mã phản hồi HTTP của wget --spider cho blog của tôi. Nếu nó không phải 200, nó thông báo cho tôi (tôi tin rằng điều này sẽ tốt hơn là chỉ ping nó, vì trang web có thể bị tải nặng và có thể hết thời gian hoặc phản hồi rất muộn). Bây giờ ngày hôm qua, có một số vấn đề với Internet của tôi. LAN đã được kết nối tốt nhưng tôi không thể truy cập bất kỳ trang web nào. Vì vậy, tôi tiếp tục nhận thông báo vì tập lệnh không thể tìm thấy 200 trong phản hồi wget. Bây giờ tôi muốn đảm bảo rằng nó sẽ hiển thị thông báo cho tôi khi tôi có kết nối internet.

Vì vậy, việc kiểm tra kết nối DNS và LAN là hơi quá đối với tôi vì tôi không có nhu cầu cụ thể đó để tìm ra vấn đề gì. Vì vậy, những gì bạn đề nghị làm thế nào tôi làm điều đó?

Đây là kịch bản của tôi để tiếp tục kiểm tra thời gian chết cho blog của tôi:

#!/bin/bash

# Sending the output of the wget in a variable and not what wget fetches
RESULT=`wget --spider http://blog.ashfame.com 2>&1`
FLAG=0

# Traverse the string considering it as an array of words
for x in $RESULT; do
    if [ "$x" = '200' ]; then
        FLAG=1 # This means all good
    fi
done

if [ $FLAG -eq '0' ]; then
    # A good point is to check if the internet is working or not
        # Check if we have internet connectivity by some other site
        RESULT=`wget --spider http://www.facebook.com 2>&1`
        for x in $RESULT; do
            if [ "$x" = '200' ]; then
                FLAG=1 # This means we do have internet connectivity and the blog is actually down
            fi
        done

    if [ $FLAG -eq '1' ]; then
        DISPLAY=:0 notify-send -t 2000 -i /home/ashfame/Dropbox/Ubuntu/icons/network-idle.png "Downtime Alert!" "http://blog.ashfame.com/ is down."         
    fi  
fi

exit

Bằng cách này, tôi chỉ cần kiểm tra kết nối internet khi có vấn đề với mã phản hồi blog của tôi. Nó hơi nặng (vì tôi không sử dụng ping) nhưng không nên đưa ra bất kỳ thông tin sai nào. Đúng? Ngoài ra, làm thế nào tôi có thể ngẫu nhiên chuyển sang một trang web khác mọi lúc, như facebook, google, yahoo, v.v. Ngoài ra (Tôi đang cố gắng tránh bất kỳ I / O nào) sau đó bỏ qua các kiểm tra tiếp theo cho đến khi trang web ngừng hoạt động hoặc gây ra các kiểm tra dài hơn (10 phút thay vì mỗi phút). Bạn nghĩ sao?


"Kết nối Internet" không có định nghĩa rõ ràng, bạn chỉ có thể kiểm tra kết nối với một dịch vụ cụ thể hoặc bộ dịch vụ. Nếu bạn có nghĩa là kết nối "LAN", một tùy chọn tốt là ping cổng mạng của bạn.
João Pinto

Theo thuật ngữ cư sĩ, tôi sẽ xác định kết nối Internet là nếu bạn có thể truy cập internet. Vấn đề có thể bởi bất cứ điều gì ở giữa. Tôi chỉ cần phân biệt giữa nếu nó hoạt động tốt hoặc có vấn đề trong số các vấn đề có thể chịu trách nhiệm. Tôi hy vọng tôi làm cho mình rõ ràng. :)
Ashfame

Câu trả lời:


29

Kiểm tra xem trang web cụ thể có hoạt động không

Đầu tiên, nhiều dịch vụ giám sát trực tuyến tốt có sẵn. Để chọn một, Pingdom bao gồm tài khoản miễn phí để theo dõi một mục tiêu. (Tuyên bố miễn trừ trách nhiệm: Tôi không liên kết với Pingdom dưới bất kỳ hình thức nào).

Thứ hai, sử dụng wget --spidercho kịch bản của riêng bạn là một ý tưởng tốt. Bạn sẽ nhận được một số thông báo sai khi máy tính của bạn bị hỏng hoặc khi máy chủ DNS của bạn không hoạt động. Kiểm tra mã trả lại là cách đơn giản để thực hiện việc này:

wget --spider --quiet http://example.com
if [ "$?" != 0 ]; then
  echo "Website failed!" | mail -s "Website down" your_email@provider.tld
fi

Một lần nữa, có những thiếu sót trong phương pháp này. Nếu nhà cung cấp của bạn đã lưu bộ nhớ DNS của bạn, nhưng máy chủ DNS không hoạt động, những người khác không thể truy cập trang web của bạn mặc dù giám sát cho biết mọi thứ đều ổn. Bạn có thể viết cách giải quyết ngắn với host, ví dụ host example.com <your dns server IP>. Điều đó sẽ trả về lỗi nếu máy chủ DNS không phản hồi, ngay cả khi OpenDNS hoặc máy chủ DNS của nhà cung cấp của bạn hoạt động tốt.

Kiểm tra xem internet có hoạt động không

Không có cách nào thực sự dễ dàng để xử lý việc này trong mọi trường hợp.

Ví dụ, bạn có thể chạy ping -c1trên nhiều trang web nổi tiếng (ví dụ www.google.com, facebook.com và ping.funet.fi) và kiểm tra mã trả về để xác định xem có thể truy cập được đích nào không. Bạn có thể tự động kiểm tra mã trả về bằng cách sử dụng biến $?. Tham số -c1là giới hạn số lượng gói ping thành một.

Bạn có thể gặp phải sự cố với một số wifis công khai khi có một cổng đăng nhập chuyển hướng tất cả các ping và yêu cầu HTTP. Nếu vậy, bạn có thể nhận được phản hồi ping và mã trạng thái HTTP không lỗi, ngay cả khi bạn không thể truy cập bất kỳ trang web nào khác.

Nếu bạn muốn kiểm tra trạng thái cáp, bạn có thể sử dụng

sudo ethtool eth0

Từ đầu ra (trích):

Speed: 1000Mb/s
Duplex: Full
Port: Twisted Pair
Link detected: yes

Tuy nhiên, điều này không cho biết bạn có thực sự có kết nối hay không, chỉ là liệu cáp có được kết nối hay không và có gì đó ở đầu bên kia.


Điều này hoàn toàn dành cho thiết lập của tôi, hoạt động trên Ethernet luôn BẬT. Nhưng rất vui vì bạn đã chỉ ra cách nó không hoạt động chính xác trong một số trường hợp. Ngoài ra tôi tin rằng ping sẽ nhanh hơn wget. Bạn nghĩ sao? và nếu tôi đang kiểm tra 200 mã trạng thái ở bất cứ đâu, tôi thà chỉ ping nó. Đúng? hoặc có điều gì mà tôi nên biết?
Ashfame

2
ping nhanh hơn và tốt hơn, vì đầu kia sẽ không giận bạn. ping khá an toàn, nhưng thậm chí điều đó không đảm bảo rằng bạn có thể mở các trang web. Ngoài ra, có thể tường lửa đang chặn ping nhưng cho phép các yêu cầu HTTP.
Olli

1
Ping một máy chủ dns nổi tiếng như 4.2.2.2 cũng hữu ích trong trường hợp bạn có kết nối mạng nhưng bị hỏng dns.
djeikyb

Để kiểm tra DNS tất nhiên bạn có thể sử dụng host(truy vấn DNS). Nó cũng rất nhanh.
Olli

Cảm ơn câu trả lời của bạn @Olli & @djeikyb Tôi đã cập nhật câu hỏi, xin hãy xem
Ashfame

7

Tôi đang sử dụng phương pháp này ...

if [["$ (ping -c 1 8.8.8.8 | grep 'mất gói 100%')"! = ""]]; sau đó
    echo "Internet không có mặt"
    thoát 1
khác
    tiếng vang "Internet là hiện tại"
    wget www.site.com
fi

Tôi đã nhận được kết quả khác nhau cho ping -c 1 8.8.8.8ping -c 1 www.google.com. Làm như thế nào?
MERose 3/03/2015

2
Lưu ý rằng điều này sẽ thất bại ở Trung Quốc và các quốc gia khác chặn Google
Tom J Nowell

7

Tôi vừa mới sử dụng

nm-online

mà tạm dừng cho đến khi có kết nối mạng bởi người quản lý mạng. Làm việc tốt. Bạn có thể làm những thứ khác với nó quá.


6

Kiểm tra để xem nếu một trang web lên thường được thực hiện với một công cụ giám sát như thế nào nagios. Điều này sẽ liên tục theo dõi trang web, và có thể thông báo cho bạn về việc ngừng hoạt động.

Khi kiểm tra xem Internet có lên từ dòng lệnh không, tôi chạy qua một số bước:

  • Kiểm tra Internet là lên ping google.com(kiểm tra DNS và trang web có thể truy cập được biết).
  • Kiểm tra trang web đang sử dụng wgethoặc w3mđể tìm nạp trang.

Nếu Internet không được chẩn đoán ra bên ngoài.

  • Kiểm tra cổng là pingable. (Kiểm tra ifconfig cho địa chỉ cổng.)
  • Kiểm tra máy chủ DNS có thể ping được không. (Kiểm tra /etc/resolv.conf để biết địa chỉ.)
  • Kiểm tra xem tường lửa có chặn không. (Kiểm tra / var / log / syslog khi tôi đăng nhập các khối.)

Nếu Internet bị sập nhưng trang web không hoạt động, hãy kiểm tra w3m http://isup.me/example.comthay thế example.combằng trang web xuất hiện. Sử dụng wget, lynx hoặc trình duyệt dòng lệnh nào bạn có sẵn nếu bạn chưa cài đặt trình duyệt w3m.


Cảm ơn lời đề nghị của bạn! Liệu kịch bản của tôi có bao gồm các yêu cầu cơ bản về kiểm tra và cảnh báo tôi khi trang web của tôi không hoạt động không? Và nó sẽ yên lặng trong trường hợp có một số vấn đề kết nối Internet
Ashfame

Có vẻ như kịch bản của bạn sẽ làm những gì bạn muốn. Bạn có thể bao gồm lệnh wget trong câu lệnh if như if ! wget --spider http:///example.com; then.
BillThor

ý bạn là wget luôn trả về 1 cho 200 mã phản hồi HTTP?
Ashfame

Ý tôi là bài kiểm tra [ $? != 0 ]giống như bài kiểm tra ! command. wget được ghi nhận là trả về 0 khi thành công và không 0 cho thất bại. Nếu hành vi giống hệt nhau mà bạn từng mã nó. Nếu wget trả về thất bại trên 200 phản hồi, bài kiểm tra sẽ thất bại theo cách bạn viết. Tương tự nếu nó trả về 0 cho mã phản hồi khác 200.
BillThor

Cảm ơn! Điều đó sẽ làm cho kịch bản nhỏ hơn và dễ hiểu.
Ashfame

4

Đây là srcript shell tôi đang sử dụng để kiểm tra kết nối internet:

báo động

#! /bin/bash

if curl --silent --head http://www.google.com/ |
    egrep "20[0-9] Found|30[0-9] Found" >/dev/null
then
    echo Internet status: OK
else
    echo Internet status: ERROR
    mpg321 alarm.mp3 &> /dev/null
fi
sleep 60
clear

./alarm.sh

Bạn sẽ cần cài đặt curl và mpg321

sudo apt-get install curl mpg321

Bạn sẽ cần một tệp âm thanh .mp3 được đổi tên thành alarm.mp3 trong cùng thư mục nếu bạn muốn chức năng báo động âm thanh. Cuối cùng cấu hình URL trang web và egrep theo nhu cầu của bạn.


Điều này hoạt động hoàn hảo ngay cả khi người dùng ở đằng sau một cổng bị khóa và chưa đăng nhập.
Ashhar Hasan

Bạn có thể sử dụng egrep -qthay vìegrep ... > /dev/null
wjandrea

Tại sao đoạn script gọi chính nó thay vì chỉ sử dụng một whilevòng lặp?
wjandrea

Oh chờ đã, nó không tự gọi. Nó gọi một tập lệnh được gọi alarm.shtrong wd, vì vậy nếu bạn gọi tập lệnh này từ một thư mục khác, nó sẽ bị lỗi hoặc nếu có một tập lệnh được gọi alarm.shtrong wd, thay vào đó, nó sẽ gọi nó. Vì vậy, đó là thực tế xấu. Bạn có thể sử dụng "$0"thay thế, nhưng một whilevòng lặp sẽ tốt hơn.
wjandrea

"Tại sao tập lệnh tự gọi nó thay vì chỉ sử dụng vòng lặp while?": Bởi vì tôi là một người mới khi tôi thực hiện bài đăng đó và vâng, kịch bản đó đã tự gọi.
01BTC10

2

Kiểm tra xem internet có hoạt động không

sudo nm-tool | grep "State: connected" | wc -l

Từ đầu ra (trích):

1 #System is connected to internet

Tuy nhiên, như được đề cập bởi những người khác, điều này không cho biết bạn có thực sự có kết nối hay không. Ví dụ. Bạn có thể được kết nối với bộ định tuyến và bộ định tuyến không nhất thiết phải kết nối với internet.


2
nm-toolđã bị xóa trong Ubuntu 15.04+, nhưng bạn có thể sử dụng nmclithay thế. Ví dụ:[[ $(nmcli -f STATE -t g) = connected ]]
Sáu

@Six nmcli -f STATE -t nmđiều tốt là độc lập với các trang web!
Sức mạnh Bảo Bình

1
Lưu ý rằng nm-toolnmclisẽ chỉ cho bạn biết bạn có kết nối với mạng cục bộ hay không, tức là bạn có kết nối với wifi / ethernet tại nhà hay không. Nó sẽ không cho bạn biết liệu bạn có thể truy cập bất cứ thứ gì ngoài mạng cục bộ của mình hay không, ví dụ như internet.
Sergiy Kolodyazhnyy

1

Tôi đang sử dụng phương pháp này:

if curl -s --head  --request GET www.google.com | grep "200 OK" > /dev/null ; then
    echo "Internet is present"
else
    echo "Internet isn't present"
fi

Nó sẽ cố gắng kết nối với một trang web nổi tiếng và nếu nó có thể kết nối với nó thì chúng tôi sẽ cho rằng có internet.


0

Tôi cần giúp đỡ với cùng một câu hỏi và tôi đã có câu trả lời theo cách này:

echo $(nm-online) $? connection problems

Cái này hoạt động ra sao?
wjandrea

Nó chỉ kiểm tra trạng thái (một ký tự) của nm-onlinelệnh ... Nó sẽ trả về 0 nếu mọi thứ đều ổn. Thông thường trong tất cả các UNIXvỏ.
Antonio

0

Kiểm tra xem Internet có hoạt động không quá tầm thường. ping là ICMP, vì vậy nó có thể hoạt động ngay cả khi proxy web bị hỏng. Một cái gì đó tương tự xảy ra với DNS nếu bạn kiểm tra bằng IP.

Vì kết nối Internet của tôi không ổn định, tôi đã tạo tập lệnh này ( dựa trên tập lệnh này ) để tạo ra âm thanh hợp âm nhẹ nhàng để gọi cho tôi và cũng sử dụng thông báo Ubuntu khi kết nối Internet trở lại:

#!/bin/bash

hash play 2>&- || { echo >&2 "I require «play» but it's not installed. Try apt-get install sox. Aborting."; exit 1; }

WGET="`which wget`"
URL="http://www.google.com"
delay=3;
noConnectionMessage="No connection, trying again in $delay seconds...";
connectionMessage="WE HAVE INTERNET! :) Trying again in $delay seconds...";

echo "INTERNET TESTER: Type Ctrl+C to quit";
rm --force /tmp/index.site

function playSound {
    time=1;    # Time played
    if [ `sox --version| grep -oP "v[0-9.]+" | sed "s/[v.]//g"` -lt 1431 ]; then    #analize sox version, if greater than v14.3.1 can use pluck
        play -q -n synth $time sine;
    else
        play -q -n synth $time pluck $1;
        #for i in G4 G4 G4 E4;do play -n synth 0.1 pluck $i repeat 2;done    # You can play with something like this also :) (first three notes from Beethoven 5th symphony)
    fi
}

while [ 1 -eq 1 ]; do
    $WGET -q --tries=10 --timeout=2 $URL -O /tmp/index.site &> /dev/null
    if [ ! -s /tmp/index.site ];then
        echo $noConnectionMessage;
        #playSound E2
        sleep 1;
    else
        #~ zenity --warning --text "ADDRESS is back"
        notify-send -i "notification-network-wireless-full" "Connection state:" "$connectionMessage";
        echo $connectionMessage;
        playSound E3
    fi
    sleep $delay;
done

exit 0;

0

Tôi đang tìm kiếm một kịch bản sẽ liên tục kiểm tra kết nối internet của mình, nó sẽ được bắt đầu bất cứ khi nào máy chủ của tôi hoạt động và tôi đã thực hiện điều này:

  1. Đầu tiên, cài đặt fping

    apt-get install fping
    
  2. Tạo một tập lệnh init trong thư mục /etc/init.d với nội dung sau (tôi gọi nó là testcon)

    #!/bin/bash
    
    PIDFILE=/var/run/testcon.pid
    
    . /lib/lsb/init-functions
    
    case "$1" in
      start)
            log_daemon_msg "Starting internet connection tester"
            /etc/init.d/testcond &
            echo $! > $PIDFILE
            log_end_msg $?
        ;;
      stop)
            log_daemon_msg "Stopping internet connection tester"
            PID=$(cat $PIDFILE)
            kill -9 "$PID"
            log_end_msg $?
        ;;
      *)
        echo "Usage: /etc/init.d/testcon {start|stop}"
        exit 1
        ;;
    esac
    
    exit 0
    
  3. Tạo một tập lệnh trong thư mục /etc/init.d với nội dung sau (tôi gọi nó là testcond)

    #echo Computer starting or testing daemon init
    while [ "$itest" == "" ] 
    do
        #wait 5 seconds 
        sleep 5
        itest=$(fping 8.8.8.8 | grep alive)
    done
    date | mail -s "Server is up and Internet is online" your_email@gmail.com
    
    #loop forever
    while [ "1" == "1" ] 
    do
        itest=$(fping 8.8.8.8 | grep alive)
        #if internet is down
        if [ "$itest" == "" ] 
        then
            #echo Internet is down
            #log time it was found down
            current_time=$(date)
            echo "Internet was found down @ $current_time" >> /mnt/data/Server/internet_log.txt
            #loop until it is back
            while [ "$itest" == "" ] 
            do
                #wait 60 seconds 
                sleep 60
                itest=$(fping 8.8.8.8 | grep alive) # test the internet
            done
            #when it is back
            current_time=$(date)
            echo "Internet is back        @ $current_time" >> /mnt/data/Server/internet_log.txt
            body=$(tail -2 /mnt/data/Server/internet_log.txt)
            echo "$body" | mail -s "Internet is back online" your_email@gmail.com
        fi
        #echo Internet is online
        #wait 60 seconds
        sleep 60
            done
    
  4. Sau đó, tôi chạy các lệnh bên dưới để thêm vào phần khởi động:

    sudo update-rc.d testcon defaults
    sudo update-rc.d testcon enable
    
  5. Khởi động lại


0

Tôi đã phải đối mặt với sự phân bổ ngẫu nhiên các kết nối Wi-Fi bởi Broadcom BCM94331CDchip của mình . Tôi đã nghĩ ra tập lệnh bash sau (vòng lặp vô hạn) kiểm tra từng giây nếu kết nối Internet Wi-Fi hoạt động. Dòng lệnh khác được đề xuất ở đây sẽ đợi ít nhất 5 đến 10 giây trước khi đóng với trạng thái tức là ping. Trong thời gian đó tôi cũng đang tìm kiếm một giải pháp dứt khoát.

Từ kết quả trên Askubfox, tôi sẽ phải thanh lọc bcmwl-kernel-sourcegói khi tôi sử dụng firmware-b43-installerb43-fwcutter.

Cảm ơn tất cả mọi người cho đề xuất của họ (ở trên).

Tập lệnh này cần được thêm vào trong Chương trình khởi nghiệp và không cần super userđặc quyền để chạy.

#!/bin/bash
#

# Check if Wi-Fi is disabled e.g. 'out of range'
# If so quickly re-enable Wi-Fi
# Due to a problem with Broadcom proprietary driver in package firmware-b43-installer

# Script is part of Start-Up programs
# Stored in /usr/local/bin/
# Infinite loop checking every second if Wi-Fi is up and running

while true; do
  # https://askubuntu.com/questions/27954/how-can-i-check-internet-connectivity-in-a-console
  if [[ $(nmcli -f STATE -t g) != 'connected' ]]; then
    # Disable and Re-Enable Wi-Fi as the Wi-Fi is now 'out of range' (disconnected)
    nmcli radio wifi off
    nmcli radio wifi on
  fi
  sleep 1
done
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.