"인터넷 연결 체크리스트 라인"

"인터넷 연결 체크리스트 라인"

이렇게 하면 "인터넷 연결"이 있는지 확인할 수 있습니다. "인터넷 연결"이 없는 경우(이 두 위치에 성공적으로 ping됨) 600초 동안 기다린 후 계속됩니다.

ping -W 1 -c 4 www.google.com >& /dev/null && ping -W 1 -c 4 www.yahoo.com >& /dev/null || sleep 600

하지만: 인터넷에 연결될 때까지 반복되도록 이 줄을 어떻게 다시 작성할 수 있습니까?

답변1

while ! ping -W 1 -c 4 www.google.com >& /dev/null ||
      ! ping -W 1 -c 4 www.yahoo.com >& /dev/null; do
  sleep 600
done

IP 주소에 대한 연결을 테스트하고 있지만 8.8.8.8은 Google의 공개 DNS 서버입니다(가용성이 매우 높습니다). 항목이 캐시에 있을 수 있으므로 DNS가 작동하는지 테스트하는 것은 어쨌든 신뢰할 수 없습니다.

while ! ping -W 1 -c 1 8.8.8.8 >&/dev/null; do sleep 600; done

Ping이 항상 인터넷 연결을 확인하는 가장 좋은 방법은 아닙니다. 많은 장소, 특히 기업 네트워크에서는 웹 액세스를 제외한 모든 액세스를 차단합니다. 고가용성 서버에서 파일을 다운로드하여 네트워크가 제대로 작동하는지 테스트할 수 있습니다. 이는 또한 적어도 HTTP 프록시의 관점에서 DNS를 테스트합니다(종종 중요함).

while ! wget -q -O /dev/null --no-cache http://www.google.com/; do sleep 6000; done

답변2

위의 방법 중 일부에는 몇 가지 결함이 있으며 왜 포괄적인 "인터넷이 작동하고 있습니까?"를 한 문장으로 완료할 수 없는 이유는 다음과 같습니다.

  • 핑을 시도하기 전에 항상 링크가 활성화되어 있는지 확인해야 합니다. 이더넷 포트에 케이블이 연결되어 있지 않거나 멍청한 고양이가 전선을 씹어먹고 있다면 아무 것도 작동하지 않습니다.

  • 먼저 localhost를 테스트해야 합니다. 이렇게 하면 TCP/IP 스택의 무결성이 확인됩니다.

  • DNS 서버에 연결할 수 없거나 차단된 경우 도메인 이름을 지정하여 DNS 확인에 의존하지 못할 수 있습니다. 선호하는 DNS 서버가 다운되었다고 해서 인터넷을 통해 다른 호스트에 연결할 수 없다는 의미는 아닙니다.

  • 자신에게 속하지 않은 서버의 연결을 확인하기 위해 항상 동일한 주소나 호스트를 사용하는 것은 좋지 않습니다. 항상 사용 가능한 것으로 알려진 다양한/무작위 호스트 집합에 대해 테스트해야 하며, 가급적 네트워크 외부에 있는 자신이 소유한 호스트를 대상으로 테스트해야 합니다.

  • "인터넷"이 제대로 작동하는지 실제로 확인하려면 다양한 프로토콜을 사용해야 한다고 말하고 싶습니다. 네트워크의 좀비 컴퓨터가 DDoS의 일부로 많은 핑을 보내고 ISP가 ICMP를 차단할 수도 있습니다.

정말로 단방향 접근 방식을 취해야 한다면, 제가 할 일은 google.com이나 여러분이 선택한 다른 잘 알려진 인터넷 사이트로의 경로를 추적하는 것입니다. 한번 만. 트래픽이 서비스 제공업체의 네트워크를 떠나기 전에 얼마나 많은 홉을 거쳐야 하는지 이해하세요. 그런 다음 Traceroute를 사용하여 외부 연결을 테스트할 수 있지만 홉 수는 제한됩니다. Traceroute의 최종 Ping이 성공하면 네트워크를 종료할 수 있습니다. HTTP 등과 같은 다른 프로토콜에 대해 "traceroute와 유사한" 유틸리티를 갖고 싶습니다.

답변3

쉘에서 while 루프를 사용할 수 있습니다.

while true; do
    if ping -W 1 -c 4 www.google.com >& /dev/null &&
       ping -W 1 -c 4 www.yahoo.com >& /dev/null; then
        break
    fi
    sleep 600
done

/bin/trueand 명령은 test 0항상 0(true)을 반환하지만 true항상 내장 명령이 아닐 수도 있습니다.

답변4

논리를 좀 더 명확하게 하기 위해 다음과 같이 서브셸에 수표를 작성할 수 있습니다.

while ! ( ping -W 1 -c 4 www.google.com >& /dev/null &&
          ping -W 1 -c 4 www.yahoo.com >& /dev/null ); do
    sleep 600
done

또는 함수에 테스트를 작성하세요.

can_ping_internet() {
    ping -W 1 -c 4 www.google.com && ping -W 1 -c 4 www.yahoo.com
}

while ! can_ping_internet; do
    sleep 600
done

관련 정보