Bash로 인터넷 연결을 테스트하는 방법은 무엇입니까?


113

일부 웹 사이트를 핑하지 않고 어떻게 인터넷 연결을 테스트 할 수 있습니까? 연결되어 있지만 사이트가 다운되면 어떻게됩니까? 세상과의 연결에 대한 점검이 있습니까?


2
여러 다른 사이트를 핑합니까?

1
하지만 웹 사이트를 핑하고 싶지 않습니다. 다른 옵션이 없나요?
lauriys

6
나는 다른 방법이 있을지도 모른다는 것을보고 싶다!
lauriys

2
한 번에 오프라인으로 전환하지 않는 것으로 알고있는 주소 집합에 단일 패킷을 보내고받는 것보다 더 좋은 방법은 없습니다. 또 다른 방법은 응용 프로그램이 더 공개적으로 ping을 수행하지 않도록하는 경우 현재 설정된 DNS를 확인하는 것입니다. 도메인.
Tamara Wijsman

14
누군가 소리를 내지 않고 듣고 있는지 알고 싶습니다!
Kaz

답변:


131

핑없이

#!/bin/bash

wget -q --spider http://google.com

if [ $? -eq 0 ]; then
    echo "Online"
else
    echo "Offline"
fi

-q : 무음 모드

-거미 : 이해하지 말고 페이지 가용성을 확인하십시오.

$? : 쉘 리턴 코드

0 : 쉘 "All OK"코드

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

2
아주 멋지지만 물론 상자에 wget이 있다고 가정합니다. 임베디드 장치와 그렇지 않은 것. ;)
Eric Sebasta 2015-06-08

5
다음을 시도해보세요. echo -e "GET google.com HTTP / 1.0 \ n \ n"| nc google.com 80> / dev / null 2> & 1
user3439968

1
tcping도 여기서 도움이 될 것입니다. (tcping www.yahoo.com 80) && 에코 "사이트까지입니다"
데이비드 라미레즈

여기에서 사용하는 if / else 문은 훌륭합니다. 감사합니다 !
Danijel-James W

1
@ user3439968 시간 초과를 nc확인 하려면에 시간 초과를 추가 해야합니다. 같은 것nc google.com 80 -w 10
kaptan apr

93

기본 게이트웨이를 ping합니다.

#!/bin/bash
ping -q -w 1 -c 1 `ip r | grep default | cut -d ' ' -f 3` > /dev/null && echo ok || echo error

14
좋은 기술, 함수에 사용되는 수정 될 수있다 : function ping_gw() { ... && return 0 || return 1 }다음과 같이 사용 :ping_gw || (echo "no network, bye" && exit 1)
memnoch_proxy

1
이 운영 체제 Mac에서 복사 - 붙여 넣기를 통해 작업을하지 않습니다 "-bash : IP를 : 명령을 찾을 수 없습니다 핑 : 잘못된 옵션을 - 승"
베네딕트 S. Vogler

1
호스트가 연결되지 않은 상태에서 가상화 게스트에서 실행되면 잘못된 경보를 제공합니다.
Teresa e Junior

1
초등학교 OS (0.4.1, Acer Aspire E 15)에 대해 거짓 음성을 제공합니다
Malcolm

1
이것에 조심하십시오. 나는 방금 이것을 수행 ifconfig down wlan0하여 테스트했으며 여전히 기본 게이트웨이가 있으며 실제로 외부 세계에 도달 할 수는 없지만 ping 가능합니다.
Bruno Bronosky

29

사용자 somedrew 에게 감사드립니다 : https://bbs.archlinux.org/viewtopic.php?id=55485 on 2008-09-20 02:09:48

/ sys / class / net을 찾는 것이 한 가지 방법이어야합니다.

다음은 루프백 이외의 네트워크 연결을 테스트하는 스크립트입니다. 내 웹 사이트에 액세스 할 수 있는지 주기적으로 테스트하기 위해 다른 스크립트에서 아래를 사용합니다. 액세스 할 수없는 경우 팝업 창에서 문제를 알려줍니다.

아래 스크립트는 노트북이 네트워크에 연결되어 있지 않을 때마다 5 분마다 팝업 메시지를받지 못하도록합니다.

#!/usr/bin/bash

# Test for network conection
for interface in $(ls /sys/class/net/ | grep -v lo);
do
  if [[ $(cat /sys/class/net/$interface/carrier) = 1 ]]; then OnLine=1; fi
done
if ! [ $OnLine ]; then echo "Not Online" > /dev/stderr; exit; fi

bash를 처음 접하는 사람들을위한 참고 사항 : 마지막 'if'문은 온라인이 아닌 경우 [!] 테스트하고이 경우 종료됩니다. 자세한 내용은 man bash를 참조하고 "표현식 조합 가능"을 검색하십시오.

추신 : 핑은 어떤 종류 의 네트워크 에 대한 연결이 있는지 테스트하지 않고 특정 호스트에 대한 연결 테스트하는 것을 목표로하기 때문에 여기서 사용하기에 가장 좋은 것이 아니라고 생각합니다 .

PPS 위는 Ubuntu 12.04에서 작동합니다. / sys는 다른 배포판에 없을 수 있습니다. 아래를 참조하십시오.

최신 Linux 배포판에는 가상 파일 시스템으로 / sys 디렉토리가 포함되어 있습니다 (sysfs, procfs 인 / proc와 비교).이 디렉토리는 시스템에 연결된 장치를 저장하고 수정할 수있는 반면 많은 기존 UNIX 및 Unix 유사 운영 체제는 / sys는 커널 소스 트리에 대한 심볼릭 링크입니다. [인용 필요]

Wikipedia https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard에서


1
조심하세요! " cat /sys/class/net/wwan0/carrier는 우분투 14.04 LTS에서 작동하지 않습니다.
dotnetCarpenter

1
당신은 넣을 수 있습니다 2>/dev/nullcat /sys/class/net/$interface/carrier경우 네트워킹을 사용하지에 오류 출력이 없습니다에.
르노

25

이것은 MacOSX와 Linux 모두에서 작동합니다.

#!/bin/bash

ping -q -w1 -c1 google.com &>/dev/null && echo online || echo offline

osx 제외 ( ping: invalid option -- w)
avishayp 19.01.22

fping google.com또는 단순히 fping 8.8.8.8보너스와 마법 당신이 ( "테스트 할 필요없이 상태 코드를 얻을하지 google.com is alive...")
로저

9

Bash에서는 / dev / { udp , tcp } / host / port를 통해 네트워크 래퍼를 사용합니다 .

if : >/dev/tcp/8.8.8.8/53; then
  echo 'Internet available.'
else
  echo 'Offline.'
fi

( :연결을 테스트하고 싶지만 처리하지 않기 때문에 Bash no-op입니다.)


7

텔넷을 사용하여 포트 80에 연결 한 다음 텍스트를 전송하기 전에 스크립트를 작성했습니다.

HTTP/1.0 GET /index.html

두 개의 CR / LF 시퀀스가 ​​뒤 따릅니다.

어떤 형식의 HTTP 응답을 받으면 일반적으로 사이트가 작동하고 있다고 가정 할 수 있습니다.


3
바퀴를 재발 명하는 이유는 무엇입니까? curl과 wget 모두이 작업을 완벽하게 수행합니다.
Adam Rosenfield

6
wget 및 curl을 항상 사용할 수있는 것은 아니기 때문입니다 (예 : 기업 환경의 제한). Telnet은 t = 0 이후 모든 UNIX의 표준 부분이었습니다.
paxdiablo

네, 텔넷은 꽤 오랫동안 연결을 테스트하는 꽤 표준적인 방법이었습니다.
PTBNL

2
좋은 지적이지만 wget은 상당히 일반적입니다. 또 다른 옵션은 netcat (nc)이지만이 경우에는 텔넷보다 개선되지 않았습니다.
Adam Rosenfield

7

최고의 대답은 기본 게이트웨이에 완벽하게 안정적인 연결을 가질 수 있다는 사실을 놓치지 만 이것이 인터넷에서 실제로 무언가에 도달 할 수 있다는 것을 자동으로 의미하지는 않습니다. OP는 어떻게 세상과의 연결을 테스트 할 수 있는지 묻습니다. 따라서 게이트웨이 IP를 LAN 외부에있는 알려진 IP (xyzw)로 변경하여 최상위 답변을 변경하는 것이 좋습니다.

따라서 대답은 다음과 같습니다.

ping -q -w 1 -c 1 x.y.z.w > /dev/null && echo ok || echo error

또한 명령 대체 [1]에 대해 선호하지 않는 백틱 제거 .

일부 코드를 실행하기 전에 세계에 연결되어 있는지 확인하려면 다음을 사용할 수도 있습니다.

if ping -q -w 1 -c 1 x.y.z.w > /dev/null; then
    # more code
fi

6

네트워크에서 TCP 트래픽이 들어오고 나가는 것을 허용하는지 확인한 다음 다음 명령을 사용하여 공용 IP를 다시 가져올 수 있습니다.

curl ifconfig.co

5

다음 명령을 실행하여 웹 사이트가 작동 중인지 확인하고 웹 서버가 표시하는 상태 메시지를 확인합니다.

$ curl -Is http://www.google.com | head -1 HTTP/1.1 200 OK

상태 코드 '200 OK'는 요청이 성공했으며 웹 사이트에 연결할 수 있음을 의미합니다.


2
더 나은 구현은curl -Is http://www.google.com | head -1 | grep 200; if [[ $? -eq 0 ]]; then; echo "Online"; else; echo "Offline"; fi;
Luca Galasso 2019

4

로컬 네임 서버가 다운 된 경우

핑 4.2.2.1

기억하기 쉬운 상시 가동 IP입니다 (실제로는 이름 서버이기도합니다).


5
ping 8.8.8.8 (Google NS)
user3439968 2014

4

가장 많이 뽑힌 답변 은 MacOS에서 작동하지 않으므로 Mac의 경우 성공적으로 테스트했습니다.

GATEWAY=`route -n get default | grep gateway`
if [ -z "$GATEWAY" ]
  then
    echo error
else
  ping -q -t 1 -c 1 `echo $GATEWAY | cut -d ':' -f 2` > /dev/null && echo ok || echo error
fi

MacOS High Sierra 10.12.6에서 테스트 됨


2
오프라인 일 때 stderr에 오류를 기록하지 않도록 route명령을 route -n get default 2> /dev/null | grep gateway로 변경하십시오 .
devstuff

4

이 bash 스크립트는 인터넷을 지속적으로 확인하고 인터넷을 사용할 수있을 때 경고음을냅니다.

#!/bin/bash
play -n synth 0.3 sine 800 vol 0.75
while :
do
pingtime=$(ping -w 1 8.8.8.8 | grep ttl)
if [ "$pingtime" = "" ] 
then 
   pingtimetwo=$(ping -w 1 www.google.com | grep ttl) 
   if [ "$pingtimetwo" = "" ] 
   then 
       clear ; echo 'Offline'
   else
       clear ; echo 'Online' ; play -n synth 0.3 sine 800 vol 0.75
   fi 
else
    clear ; echo 'Online' ; play -n synth 0.3 sine 800 vol 0.75
fi
sleep 1
done

3

가장 짧은 방법 : fping 4.2.2.1=> "4.2.2.1 is alive"

.보다 빠르고 자세한 출력이 적기 때문에 이것을 선호합니다 ping. 단점은 설치해야한다는 것입니다.

특정 웹 사이트가 아닌 모든 공개 DNS를 사용할 수 있습니다 .

fping -q google.com && echo "do something because you're connected!"

-q 종료 코드를 반환하므로 온라인 상태에서 실행하는 예를 보여 드리겠습니다.

Mac에 설치하려면 : brew install fping; 우분투 :sudo apt-get install fping


2

Ping은 원하는 작업을 정확하게 수행하도록 설계되었습니다. 그러나 사이트가 ICMP 에코를 차단하면 항상 일부 사이트, wget 또는 curl의 포트 80으로 텔넷을 수행 할 수 있습니다.


2

Google의 색인 페이지를 확인하는 것도 다른 방법입니다.

#!/bin/bash

WGET="/usr/bin/wget"

$WGET -q --tries=20 --timeout=10 http://www.google.com -O /tmp/google.idx &> /dev/null
if [ ! -s /tmp/google.idx ]
then
    echo "Not Connected..!"
else
    echo "Connected..!"
fi

2

마찬가지로에 제시의 대답 @ ,이 옵션을 사용하는 솔루션보다 훨씬 빠를 수 ping및보다는 아마 조금 더 효율적으로 제시의 대답 @ .

find /sys/class/net/ -maxdepth 1 -mindepth 1 ! -name "*lo*" -exec sh -c 'cat "$0"/carrier 2>&1' {} \; | grep -q '1'

설명 :

이 명령은 용도 find와 함께 -exec라는 이름의 모든 파일에 명령을 실행하기 *lo*/sys/class/net/. 컴퓨터에서 사용 가능한 네트워크 인터페이스에 대한 정보가 포함 된 디렉토리에 대한 링크 여야합니다.

실행중인 명령은 해당 디렉토리 sh에있는 파일의 내용을 확인 하는 명령입니다 carrier. 의 값 $interface/carrier에는 3 가지 의미가 있습니다. 인용 :

세 가지 상태가있는 것 같습니다.

  • ./carrier를 읽을 수 없습니다 (예 : Network Manager에서 인터페이스가 비활성화 된 경우).
  • ./carrier에 "1"이 포함됨 (인터페이스가 활성화되고 WiFi 네트워크에 연결된 경우)
  • ./carrier에 "0"이 포함됨 (인터페이스가 활성화되고 WiFi 네트워크에 연결되지 않은 경우)

첫 번째 옵션은 @Jesse의 답변 에서 처리되지 않습니다 . sh스트라이프 아웃 된 명령은 다음과 같습니다.

# Note: $0 == $interface
cat "$0"/carrier 2>&1

catcarrier파일을 읽을 수 없기 때문에 실패하더라도 내용을 확인하고 모든 출력을 표준 출력으로 리디렉션 하는 데 사용됩니다 . 이러한 파일 중에서 grep -q찾게 되면 "1"적어도 하나의 인터페이스가 연결되어 있음을 의미합니다. 의 종료 코드가 grep -q최종 종료 코드가됩니다.

용법

예를 들어이 명령의 종료 상태를 사용 ~/.xprofile하면 인터넷에 연결되어있는 경우에만 gnubiff 를 시작할 수 있습니다 .

online() {
    find /sys/class/net/ -maxdepth 1 -mindepth 1 ! -name "*lo*" -exec sh -c 'cat "$0"/carrier 2>&1 > /dev/null | grep -q "1" && exit 0' {} \;
}
online && gnubiff --systemtray --noconfigure &

참고


1

Pong은 서버의 웹 서비스가 실행 중임을 의미하지 않습니다. 서버가 ICMP 에코에 응답하고 있다는 의미 일뿐입니다. curl을 사용하고 반환 값을 확인하는 것이 좋습니다.


0

인터넷 액세스 를 실제로 확인하는 것이 목표라면 이 질문에 대한 기존 답변 중 많은 부분에 결함이 있습니다. 주의해야 할 몇 가지 사항 :

  1. 인터넷에 액세스 할 수있는 네트워크없이 컴퓨터를 네트워크에 연결할 수 있습니다.
  2. 전체 인터넷에 액세스 할 수없는 상태에서 서버가 다운 될 수 있습니다.
  3. 인터넷에 액세스 할 수없는 경우에도 캡 티브 포털이 임의의 URL에 대한 HTTP 응답을 반환 할 수 있습니다.

이를 염두에두고 가장 좋은 전략은 HTTPS 연결을 통해 여러 사이트에 접속하고 해당 사이트가 응답하면 true를 반환하는 것입니다.

예를 들면 :

connected_to_internet() {
  test_urls="\
  https://www.google.com/ \
  https://www.microsoft.com/ \
  https://www.cloudflare.com/ \
  "

  processes="0"
  pids=""

  for test_url in $test_urls; do
    curl --silent --head "$test_url" > /dev/null &
    pids="$pids $!"
    processes=$(($processes + 1))
  done

  while [ $processes -gt 0 ]; do
    for pid in $pids; do
      if ! ps | grep "^[[:blank:]]*$pid[[:blank:]]" > /dev/null; then
        # Process no longer running
        processes=$(($processes - 1))
        pids=$(echo "$pids" | sed --regexp-extended "s/(^| )$pid($| )/ /g")

        if wait $pid; then
          # Success! We have a connection to at least one public site, so the
          # internet is up. Ignore other exit statuses.
          kill -TERM $pids > /dev/null 2>&1 || true
          wait $pids
          return 0
        fi
      fi
    done
    # wait -n $pids # Better than sleep, but not supported on all systems
    sleep 0.1
  done

  return 1
}

용법:

if connected_to_internet; then
  echo "Connected to internet"
else
  echo "No internet connection"
fi

이 접근 방식에 대한 몇 가지 참고 사항 :

  1. 위에서 설명한 모든 오탐 및 부정에 대해 강력합니다.
  2. 속도를 최대화하기 위해 모든 요청이 병렬로 발생합니다.
  3. 기술적으로 인터넷에 액세스 할 수 있지만 DNS가 작동하지 않거나 네트워크 설정이 엉망인 경우 false를 반환 합니다. 대부분의 경우에 합당한 일이라고 생각합니다.

curl의 리턴 코드는 테스트되지 않습니다. 내 시스템에서 네트워크를 사용할 수없는 경우 curl은 rc = 6 (DNS 확인 실패)을 제공하지만이 코드는 여전히 "인터넷에 연결됨"을보고합니다.
ceperman

@ceperman curl에 대한 리턴 코드는 표시된 행에서 테스트됩니다 if wait $pid;. 왜 그것이 당신의 시스템에서 작동하지 않는지 모릅니다. Bash를 사용하고 있습니까?
Ajedi32

@ceperman 또 다른 가능성; 아마도 맨 위의 목록에있는 URL 중 하나는 실제로 않는 다른 이름 확인을 실패에도 불구하고, 당신을 위해 반환 성공을?
Ajedi32

2
내 bash는 매우 기본적이므로 계속 읽고 wait이제 반환 코드가 실제로 테스트되고 있음을 이해합니다. 나는 당신의 코드를 다시 복사했고 오늘은 작동합니다-웁스! 나는 무엇을 어떻게 이해할 수 없지만 지난번에 뭔가를 엉망으로 만들었 음에 틀림 없다. 그럼에도 불구하고, mea culpa. 사과.
ceperman


-1

이는 여기에 게시 된 솔루션보다 훨씬 빠르며 특정 호스트 를 테스트하는 데 사용할 수 있습니다. .

트릭은 다음에서 사용하는 것보다 덜 바쁜 DNS 솔버를 사용하여 IP를 해결하는 것입니다 ping.

validateConnection () {
    host="${1}"
    ip=$(getent ahostsv4 "${host}" | awk '{ print $1 }' | head -n1)
    ping -c1 "${ip}" 2>&1 >"/dev/null"

    if [ "${?}" -ne 0 ]; then
        echo "No connection to: ${host}" >&2
        exit 1
    fi
}

2
이 링크가 질문에 답할 수 있지만 여기에 답변의 필수 부분을 포함하고 참조 용 링크를 제공하는 것이 좋습니다. 링크 된 페이지가 변경되면 링크 전용 답변이 무효화 될 수 있습니다. - 리뷰에서
David Buck

이 특정 상황에는 적용되지 않습니다.
Alberto Salvia Novella
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.