일부 웹 사이트를 핑하지 않고 어떻게 인터넷 연결을 테스트 할 수 있습니까? 연결되어 있지만 사이트가 다운되면 어떻게됩니까? 세상과의 연결에 대한 점검이 있습니까?
일부 웹 사이트를 핑하지 않고 어떻게 인터넷 연결을 테스트 할 수 있습니까? 연결되어 있지만 사이트가 다운되면 어떻게됩니까? 세상과의 연결에 대한 점검이 있습니까?
답변:
핑없이
#!/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
nc
확인 하려면에 시간 초과를 추가 해야합니다. 같은 것nc google.com 80 -w 10
기본 게이트웨이를 ping합니다.
#!/bin/bash
ping -q -w 1 -c 1 `ip r | grep default | cut -d ' ' -f 3` > /dev/null && echo ok || echo error
function ping_gw() { ... && return 0 || return 1 }
다음과 같이 사용 :ping_gw || (echo "no network, bye" && exit 1)
ifconfig down wlan0
하여 테스트했으며 여전히 기본 게이트웨이가 있으며 실제로 외부 세계에 도달 할 수는 없지만 ping 가능합니다.
사용자 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에서
cat /sys/class/net/wwan0/carrier
는 우분투 14.04 LTS에서 작동하지 않습니다.
2>/dev/null
후 cat /sys/class/net/$interface/carrier
경우 네트워킹을 사용하지에 오류 출력이 없습니다에.
이것은 MacOSX와 Linux 모두에서 작동합니다.
#!/bin/bash
ping -q -w1 -c1 google.com &>/dev/null && echo online || echo offline
ping: invalid option -- w
)
fping google.com
또는 단순히 fping 8.8.8.8
보너스와 마법 당신이 ( "테스트 할 필요없이 상태 코드를 얻을하지 google.com is alive
...")
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입니다.)
텔넷을 사용하여 포트 80에 연결 한 다음 텍스트를 전송하기 전에 스크립트를 작성했습니다.
HTTP/1.0 GET /index.html
두 개의 CR / LF 시퀀스가 뒤 따릅니다.
어떤 형식의 HTTP 응답을 받으면 일반적으로 사이트가 작동하고 있다고 가정 할 수 있습니다.
최고의 대답은 기본 게이트웨이에 완벽하게 안정적인 연결을 가질 수 있다는 사실을 놓치지 만 이것이 인터넷에서 실제로 무언가에 도달 할 수 있다는 것을 자동으로 의미하지는 않습니다. 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
네트워크에서 TCP 트래픽이 들어오고 나가는 것을 허용하는지 확인한 다음 다음 명령을 사용하여 공용 IP를 다시 가져올 수 있습니다.
curl ifconfig.co
다음 명령을 실행하여 웹 사이트가 작동 중인지 확인하고 웹 서버가 표시하는 상태 메시지를 확인합니다.
$ curl -Is http://www.google.com |
head -1 HTTP/1.1 200 OK
상태 코드 '200 OK'는 요청이 성공했으며 웹 사이트에 연결할 수 있음을 의미합니다.
curl -Is http://www.google.com | head -1 | grep 200; if [[ $? -eq 0 ]]; then; echo "Online"; else; echo "Offline"; fi;
로컬 네임 서버가 다운 된 경우
핑 4.2.2.1
기억하기 쉬운 상시 가동 IP입니다 (실제로는 이름 서버이기도합니다).
가장 많이 뽑힌 답변 은 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에서 테스트 됨
route
명령을 route -n get default 2> /dev/null | grep gateway
로 변경하십시오 .
이 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
가장 짧은 방법 : 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
마찬가지로에 제시의 대답 @ ,이 옵션을 사용하는 솔루션보다 훨씬 빠를 수 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
cat
carrier
파일을 읽을 수 없기 때문에 실패하더라도 내용을 확인하고 모든 출력을 표준 출력으로 리디렉션 하는 데 사용됩니다 . 이러한 파일 중에서 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 &
인터넷 액세스 를 실제로 확인하는 것이 목표라면 이 질문에 대한 기존 답변 중 많은 부분에 결함이 있습니다. 주의해야 할 몇 가지 사항 :
이를 염두에두고 가장 좋은 전략은 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
이 접근 방식에 대한 몇 가지 참고 사항 :
if wait $pid;
. 왜 그것이 당신의 시스템에서 작동하지 않는지 모릅니다. Bash를 사용하고 있습니까?
wait
이제 반환 코드가 실제로 테스트되고 있음을 이해합니다. 나는 당신의 코드를 다시 복사했고 오늘은 작동합니다-웁스! 나는 무엇을 어떻게 이해할 수 없지만 지난번에 뭔가를 엉망으로 만들었 음에 틀림 없다. 그럼에도 불구하고, mea culpa. 사과.
이는 여기에 게시 된 솔루션보다 훨씬 빠르며 특정 호스트 를 테스트하는 데 사용할 수 있습니다. .
트릭은 다음에서 사용하는 것보다 덜 바쁜 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
}