콘솔에서 인터넷 연결을 확인하려면 어떻게합니까?


31

콘솔에서 인터넷 연결을 확인하는 쉬운 방법이 있습니까? 쉘 스크립트에서 놀려고합니다. 인터넷 연결이 제대로 작동하는지 해석하기 위해 HTTP 응답 코드를 확인하고 확인하는 것이 하나의 아이디어 입니다. 그러나 결코 충돌하지 않는 사이트를 확인할 필요없이 쉬운 방법이 있어야한다고 생각합니다.)wget --spider http://www.google.co.in/

편집 : 개별적으로 검사 할 수있는 많은 요소가있을 수있는 것처럼 보입니다. 현재 내 의도는 내 블로그가 다운되었는지 확인하는 것입니다. 매분마다 확인하도록 cron을 설정했습니다. 이를 위해 블로그에 wget --spider의 HTTP 응답 코드를 확인하고 있습니다. 200이 아닌 경우 나에게 알립니다 (사이트에 과부하가 걸리고 시간이 초과되거나 매우 늦게 응답 할 수 있기 때문에 단순히 핑하는 것보다 낫습니다). 어제 인터넷에 문제가있었습니다. LAN이 제대로 연결되었지만 사이트에 액세스 할 수 없었습니다. 스크립트가 wget 응답에서 200을 찾을 수 없으므로 알림을 계속받습니다. 이제 인터넷에 연결되어있을 때 알림이 표시되는지 확인하고 싶습니다.

따라서 DNS 및 LAN 연결을 확인하는 것은 어떤 문제인지 알아낼 필요가 없기 때문에 약간의 과잉입니다. 어떻게하면 좋을까요?

다음은 내 블로그의 가동 중지 시간을 확인하는 스크립트입니다.

#!/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

이 방법으로 블로그 응답 코드에 문제가있는 경우에만 인터넷 연결을 확인해야합니다. 핑을 사용하지 않기 때문에 조금 무겁지 만 잘못된 긍정을 나타내서는 안됩니다. 권리? 또한 페이스 북, google, yahoo 등과 같이 매번 다른 사이트에 핑을 무작위로 할당하는 방법은 무엇입니까? 그런 다음 사이트가 다운 될 때까지 추가 확인을 건너 뛰거나 더 긴 확인을 수행합니다 (1 분마다 10 분). 어떻게 생각해?


"인터넷 연결"에는 명확한 정의가 없으며 특정 서비스 또는 서비스 세트에 대한 연결 만 테스트 할 수 있습니다. "LAN"연결을 의미하는 경우 네트워크 게이트웨이를 ping하는 것이 좋습니다.
주앙 핀토

평신도 용어로, 인터넷에 연결할 수 있다면 인터넷 연결이 가능하다고 정의합니다. 그 사이에 문제가 생길 수 있습니다. 나는 잘 작동하는지 또는 책임이있는 문제 세트에서 문제가 있는지 구별해야합니다. 나는 나 자신을 명확하게했다. :)
Ashfame

답변:


29

특정 웹 사이트가 작동하는지 확인

첫째, 여러 가지 우수한 온라인 모니터링 서비스를 이용할 수 있습니다. 하나를 선택하기 위해 Pingdom에는 하나의 대상을 모니터링하기위한 무료 계정이 포함되어 있습니다. (면책 조항 : 나는 어떤 방식으로도 Pingdom과 제휴 하지 않습니다 ).

둘째, wget --spider자신의 스크립트에 사용하는 것이 좋습니다. 컴퓨터가 다운되거나 DNS 서버가 작동하지 않을 때 오 탐지가 발생합니다. 리턴 코드를 점검하는 것은 이것을 구현하는 간단한 방법입니다.

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

그러나이 접근법에는 단점이 있습니다. 공급자가 DNS 레코드를 캐시했지만 DNS 서버가 다운 된 경우 모니터링에 문제가 없다고하더라도 다른 사용자가 사이트에 액세스 할 수 없습니다. host예를 들어 간단한 해결 방법을 쓸 수 있습니다 host example.com <your dns server IP>. OpenDNS 또는 자체 공급자의 DNS 서버가 제대로 작동하더라도 DNS 서버가 응답하지 않으면 오류가 반환됩니다.

인터넷이 작동하는지 확인

모든 경우에 이것을 처리하는 쉬운 방법은 없습니다.

예를 들어 실행할 수 있습니다 ping -c1 잘 알려진 여러 사이트 (예 : www.google.com, facebook.com 및 ping.funet.fi)에서 실행하고 반환 코드를 확인하여 목적지에 도달 할 수 있는지 확인할 수 있습니다. variable을 사용하여 리턴 코드를 자동으로 확인할 수 있습니다 $?. 매개 변수 -c1는 핑 패킷 수를 하나로 제한합니다.

모든 핑 및 HTTP 요청을 리디렉션하는 로그인 게이트웨이가있는 경우 일부 공용 Wi-Fi에 문제가 발생할 수 있습니다. 그렇다면 다른 사이트에 액세스 할 수없는 경우에도 핑 응답 및 오류가 아닌 HTTP 상태 코드가 표시 될 수 있습니다.

케이블 상태를 확인하려면

sudo ethtool eth0

출력에서 (발췌) :

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

그러나 이것은 당신이 정말로 케이블이 연결되어 단지 여부, 연결이 있는지 여부 말하는되지 뭔가 다른 쪽 끝을에 있습니다.


이것은 Always-ON 이더넷에서 작동하는 설정에 대한 것입니다. 그러나 어떤 경우에는 올바르게 작동하지 않는 방법을 지적하게되어 기쁩니다. 또한 핑은 wget보다 빠를 것이라고 믿습니다. 어떻게 생각해? 어디서나 200 상태 코드를 확인하고 있다면 핑을하는 것입니다. 권리? 아니면 내가 알아야 할 것이 있습니까?
Ashfame

2
다른 쪽 끝은 당신에게 화를 내지 않기 때문에 핑은 더 빠르고 더 좋습니다. 핑은 꽤 안전하지만 웹 페이지를 열 수 있다고 보장하지는 않습니다. 또한,는 가능한 방화벽 핑을 차단하지만 HTTP 요청을 허용하고있다.
Olli

1
4.2.2.2와 같이 잘 알려진 DNS 서버를 핑 (Ping)하는 것은 네트워크 연결이 있지만 DNS가 손상된 경우에도 유용합니다.
djeikyb

DNS 확인을 위해 물론 host(DNS 쿼리)를 사용할 수 있습니다 . 또한 매우 빠릅니다.
Olli 2019

귀하의 답변에 감사드립니다 @Olli & @djeikyb 질문을 업데이트했습니다. 살펴보십시오
Ashfame

7

이 방법을 사용하고 있습니다 ...

if [[ "$ (ping -c 1 8.8.8.8 | grep '100 % packet loss')"! = ""]]; 그때
    에코 "인터넷이 없습니다"
    1 번 출구
그밖에
    에코 "인터넷이 있습니다"
    wget www.site.com
fi

나는 다른 결과를 가지고 ping -c 1 8.8.8.8ping -c 1 www.google.com. 방법 것입니다?
MERose

2
Google을 차단하는 중국 및 기타 국가에서는 실패합니다.
Tom J Nowell

7

방금 사용한

nm-online

네트워크 관리자가 네트워크에 연결될 때까지 일시 중지합니다. 잘 작동했습니다. 그것으로 다른 것들도 할 수 있습니다.


6

사이트가 작동하는지 확인하는 것은 일반적으로 다음과 같은 모니터링 도구를 사용하여 수행됩니다. nagios 합니다. 그러면 사이트가 지속적으로 모니터링되고 중단을 알릴 수 있습니다.

인터넷이 명령 줄에서 작동하는지 확인할 때 여러 단계를 수행합니다.

  • 인터넷이 작동하는지 확인하십시오 ping google.com(DNS 및 알려진 도달 가능한 사이트를 확인하십시오).
  • 웹 사이트가 사용 wget중이거나 w3m페이지를 가져 오는지 확인하십시오.

인터넷이 작동하지 않으면 바깥쪽으로 진단하십시오.

  • 게이트웨이가 핑 가능한지 확인하십시오. 게이트웨이 주소에 대한 ifconfig를 확인하십시오.
  • DNS 서버가 핑 가능한지 확인하십시오. (주소는 /etc/resolv.conf를 확인하십시오.)
  • 방화벽이 차단되고 있는지 확인하십시오. (I 로그 블록으로 / var / log / syslog를 확인하십시오.)

인터넷이 작동하지만 사이트가 작동 중지 된 경우 표시되는 사이트 로 w3m http://isup.me/example.com교체 example.com하여 확인하십시오 . w3m 브라우저가 설치되어 있지 않은 경우 wget, lynx 또는 사용 가능한 명령 행 브라우저를 사용하십시오.


당신의 제안에 감사드립니다! 내 스크립트는 사이트가 다운되었을 때 확인하고 경고하는 기본 요구 사항을 다루고 있습니까? 인터넷 연결에 문제가있는 경우에는 조용히하겠습니다
Ashfame

스크립트가 원하는 것을 수행하는 것처럼 보입니다. if 문에 wget 명령을로 포함시킬 수 있습니다 if ! wget --spider http:///example.com; then.
BillThor

wget은 항상 200 HTTP 응답 코드에 대해 1을 반환한다는 의미입니까?
Ashfame

테스트 [ $? != 0 ]가 테스트 와 동일 하다는 것을 의미합니다 ! command. wget은 성공하면 0을 리턴하고 실패는 0이 아닌 것으로 문서화됩니다. if는 코딩하는 방식과 동일하게 동작합니다. wget이 200 응답으로 실패를 리턴하면 테스트는 사용자가 작성하는 방식으로 실패합니다. 200 이외의 응답 코드에 대해 0을 반환하면 동일합니다.
BillThor

감사! 그러면 스크립트가 작고 이해하기 쉽습니다.
Ashfame

4

이것은 인터넷 연결을 테스트하기 위해 사용하는 쉘 스크립트입니다.

alarm.sh

#! /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

curl 및 mpg321을 설치해야합니다.

sudo apt-get install curl mpg321

가청 경보 기능을 사용하려면 동일한 폴더에서 .mp3 사운드 파일의 이름이 alarm.mp3로 바뀌어야합니다. 마지막으로 웹 사이트 URL을 구성하고 필요에 맞게 egrep하십시오.


이것은 포로 포털 뒤에 있고 로그인하지 않은 경우에도 완벽하게 작동합니다.
Ashhar Hasan

당신이 사용할 수있는 egrep -q대신에egrep ... > /dev/null
wjandrea

while루프를 사용하는 대신 스크립트가 자체적으로 호출 됩니까?
wjandrea

아, 잠깐만 요. alarm.shwd에서 호출 된 스크립트를 호출 하므로 다른 dir에서이 스크립트를 호출하면 오류가 발생하거나 alarm.shwd에서 호출 된 스크립트 가 있으면 대신 호출합니다. 그래서 그것은 나쁜 습관입니다. "$0"대신 사용할 수 있지만 while루프가 더 좋습니다.
wjandrea

"왜 while 루프를 사용하는 대신 스크립트 자체를 호출 하는가?"
01BTC10

2

인터넷이 작동하는지 확인

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

출력에서 (발췌) :

1 #System is connected to internet

그러나 다른 사람들이 언급했듯이 이것은 실제로 연결되어 있는지 여부를 알려주지 않습니다. 예 : 라우터에 연결할 수 있고 라우터가 반드시 인터넷에 연결되어 있지는 않습니다.


2
nm-toolUbuntu 15.04+에서 제거되었지만 nmcli대신 사용할 수 있습니다 . 예[[ $(nmcli -f STATE -t g) = connected ]]
6

@ 6 nmcli -f STATE -t nm좋은 점은 웹 사이트와 독립적입니다!
물병 자리 힘

1
주의 nm-toolnmcli당신이에 연결하는 경우에만 여부를 알려줍니다 지역 네트워크, 즉 당신이 당신의 집에 와이파이 / 이더넷에 연결되어 있는지 여부. 그것은 당신이 당신의 로컬 네트워크, 즉 인터넷을 넘어서 어떤 것에 도달 할 수 있는지를 알려주지 않을 것입니다.
Sergiy Kolodyazhnyy

1

이 방법을 사용하고 있습니다 :

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

잘 알려진 웹 사이트에 연결을 시도하고 웹 사이트에 연결할 수 있으면 인터넷이 있다고 가정합니다.


0

같은 질문에 도움이 필요했고 다음과 같이 대답했습니다.

echo $(nm-online) $? connection problems

어떻게 작동합니까?
wjandrea

nm-online명령 의 상태 (한 문자)를 확인하는 중 입니다. 모든 것이 정상이면 0을 반환합니다. 모든 UNIX껍질에 평소 .
Antonio

0

인터넷이 작동하는지 확인하는 것은 그리 쉬운 일이 아닙니다. 핑은 ICMP이므로 웹 프록시가 다운 된 경우에도 작동 할 수 있습니다. IP로 테스트하면 DNS에서도 비슷한 현상이 발생합니다.

내 인터넷 연결이 불안정하기 때문에이 코드를 기반 으로이 스크립트를 만들었습니다.이 스크립트 는 부드러운 소리로 전화를 걸고 인터넷 연결이 돌아올 때 우분투 알림을 사용합니다.

#!/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

인터넷 연결을 지속적으로 테스트하는 스크립트를 찾고 있었고 서버가 작동 할 때마다 시작되어 다음과 같이 만들었습니다.

  1. 먼저 fping을 설치하십시오.

    apt-get install fping
    
  2. /etc/init.d 폴더에 다음 내용으로 init 스크립트를 작성하십시오 (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. /etc/init.d 폴더에 다음 내용으로 스크립트를 작성하십시오 (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. 그런 다음 아래 명령을 실행하여 시작에 추가하십시오.

    sudo update-rc.d testcon defaults
    sudo update-rc.d testcon enable
    
  5. 재부팅


0

Broadcom BCM94331CD칩으로 인해 Wi-Fi 연결이 임의로 끊어졌습니다 . 인터넷 Wi-Fi 연결이 작동하고 있는지 확인하는 다음 bash 스크립트 (무한 루프)를 고안했습니다. 여기에 제안 된 다른 명령 줄은 상태로 종료하기 전에 5-10 초 정도 기다립니다 ping. 그 동안 나는 또한 확실한 해결책을 찾고 있습니다.

askubuntu에 결과로부터, 나는 제거해야합니다 bcmwl-kernel-source내가 사용으로 패키지를 firmware-b43-installer하고 b43-fwcutter.

그들의 제안에 대해 감사합니다.

이 스크립트는 시작 프로그램에 추가해야 super user하며 실행할 권한도 필요하지 않습니다 .

#!/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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.