จะทดสอบการเชื่อมต่ออินเทอร์เน็ตโดยไม่กระตุกเว็บไซต์ได้อย่างไร? ฉันหมายความว่าจะเกิดอะไรขึ้นหากมีการเชื่อมต่อ แต่ไซต์ไม่ทำงาน มีการตรวจสอบการเชื่อมต่อกับโลกหรือไม่?
จะทดสอบการเชื่อมต่ออินเทอร์เน็ตโดยไม่กระตุกเว็บไซต์ได้อย่างไร? ฉันหมายความว่าจะเกิดอะไรขึ้นหากมีการเชื่อมต่อ แต่ไซต์ไม่ทำงาน มีการตรวจสอบการเชื่อมต่อกับโลกหรือไม่?
คำตอบ:
โดยไม่ต้อง ping
#!/bin/bash
wget -q --spider http://google.com
if [ $? -eq 0 ]; then
echo "Online"
else
echo "Offline"
fi
-q : โหมดเงียบ
--spider : อย่าเพิ่งตรวจสอบความพร้อมของหน้า
$?: รหัสส่งคืนเชลล์
0 : เชลล์รหัส "ตกลงทั้งหมด"
ไม่มี 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
ปิงเกตเวย์เริ่มต้นของคุณ:
#!/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เมื่อ 2008-09-20 02:09:48
การมองใน / sys / class / net ควรเป็นวิธีเดียว
นี่คือสคริปต์ของฉันเพื่อทดสอบการเชื่อมต่อเครือข่ายอื่นที่ไม่ใช่การวนกลับ ฉันใช้ด้านล่างนี้ในสคริปต์อื่นที่ฉันมีเพื่อทดสอบเป็นระยะว่าเว็บไซต์ของฉันสามารถเข้าถึงได้หรือไม่ หากไม่สามารถเข้าถึงได้หน้าต่างป๊อปอัปจะแจ้งเตือนฉันถึงปัญหา
สคริปต์ด้านล่างป้องกันไม่ให้ฉันได้รับข้อความป๊อปอัปทุกๆห้านาทีเมื่อใดก็ตามที่แล็ปท็อปของฉันไม่ได้เชื่อมต่อกับเครือข่าย
#!/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
หมายเหตุสำหรับผู้ที่เพิ่งทุบตี:คำสั่ง 'if' ขั้นสุดท้ายจะทดสอบว่า NOT [!] ออนไลน์และออกหากเป็นกรณีนี้ ดู man bash และค้นหา "Expressions may be combination" สำหรับรายละเอียดเพิ่มเติม
ป.ล. ฉันรู้สึกว่า ping ไม่ใช่สิ่งที่ดีที่สุดที่จะใช้ที่นี่เพราะมีจุดมุ่งหมายเพื่อทดสอบการเชื่อมต่อกับโฮสต์เฉพาะไม่ได้ทดสอบว่ามีการเชื่อมต่อกับเครือข่ายประเภทใด
PPS The Above ทำงานบน Ubuntu 12.04 / sys อาจไม่มีอยู่ใน distros อื่น ๆ ดูด้านล่าง:
การกระจาย Linux สมัยใหม่รวมถึงไดเร็กทอรี a / sys เป็นระบบไฟล์เสมือน (sysfs เทียบได้กับ / proc ซึ่งเป็น procfs) ซึ่งจัดเก็บและอนุญาตให้ปรับเปลี่ยนอุปกรณ์ที่เชื่อมต่อกับระบบในขณะที่ระบบปฏิบัติการ UNIX และ Unix แบบดั้งเดิมจำนวนมากใช้ / sys เป็นลิงก์สัญลักษณ์ไปยังแผนผังแหล่งเคอร์เนล [ต้องการอ้างอิง]
จาก Wikipedia https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard
cat /sys/class/net/wwan0/carrier
ไม่ได้กับ ubuntu 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 ใช้ network wrapper ผ่าน/ 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 เกตเวย์เป็น IP ที่รู้จัก (xyzw) ซึ่งอยู่นอก LAN ของคุณ
ดังนั้นคำตอบจะกลายเป็น:
ping -q -w 1 -c 1 x.y.z.w > /dev/null && echo ok || echo error
นอกจากนี้ยังลบ backticks ที่ไม่ได้ใช้ออกเพื่อทดแทนคำสั่ง[1] [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;
หากเซิร์ฟเวอร์ชื่อในเครื่องของคุณไม่ทำงาน
ping 4.2.2.1
เป็น IP ที่อัปเดตตลอดเวลาที่จดจำได้ง่าย (จริงๆแล้วเป็นเนมเซิร์ฟเวอร์ด้วยซ้ำ)
ด้านบนได้รับการโหวตคำตอบไม่ทำงานสำหรับ MacOS ดังนั้นสำหรับผู้ที่อยู่ในแม็คที่ผมได้ประสบความสำเร็จในการทดสอบนี้
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
เพื่อหลีกเลี่ยงการเขียนข้อผิดพลาดไปยัง stderr เมื่อออฟไลน์
สคริปต์ทุบตีนี้ตรวจสอบอินเทอร์เน็ตอย่างต่อเนื่องและส่งเสียงบี๊บเมื่ออินเทอร์เน็ตพร้อมใช้งาน
#!/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 ยังมีชีวิตอยู่"
ฉันชอบสิ่งนี้เพราะมันเร็วกว่าและผลลัพธ์ที่ละเอียดน้อยกว่าping
ข้อเสียคือคุณจะต้องติดตั้ง
คุณสามารถใช้DNS สาธารณะใด ๆแทนเว็บไซต์เฉพาะได้
fping -q google.com && echo "do something because you're connected!"
-q
ส่งคืนรหัสทางออกดังนั้นฉันแค่แสดงตัวอย่างของการเรียกใช้สิ่งที่คุณออนไลน์
จะติดตั้งบน Mac: brew install fping
; บน Ubuntu:sudo apt-get install fping
Ping ได้รับการออกแบบมาเพื่อทำสิ่งที่คุณต้องการทำ อย่างไรก็ตามหากไซต์บล็อก ICMP echo คุณสามารถทำ telnet ไปยังพอร์ต 80 ของบางไซต์ wget หรือ curl ได้ตลอดเวลา
การตรวจสอบหน้าดัชนีของ 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
เช่นเดียวกับคำตอบของ @ Jesseตัวเลือกนี้อาจเร็วกว่าโซลูชันใด ๆ ที่ใช้ping
และอาจมีประสิทธิภาพมากกว่าคำตอบของ @ Jesseเล็กน้อย
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)
ตัวเลือกแรกที่ไม่ได้รับการดูแลใน@ คำตอบของเจส sh
คำสั่งลายเอาต์คือ
# Note: $0 == $interface
cat "$0"/carrier 2>&1
cat
กำลังใช้เพื่อตรวจสอบเนื้อหาของcarrier
และเปลี่ยนทิศทางเอาต์พุตทั้งหมดไปยังเอาต์พุตมาตรฐานแม้ว่าจะล้มเหลวเนื่องจากไฟล์ไม่สามารถอ่านได้ หากgrep -q
พบ"1"
ในไฟล์เหล่านั้นหมายความว่ามีการเชื่อมต่ออย่างน้อย 1 อินเทอร์เฟซ รหัสทางออกของgrep -q
จะเป็นรหัสทางออกสุดท้าย
ตัวอย่างเช่นเมื่อใช้สถานะการออกของคำสั่งนี้คุณสามารถใช้คำสั่งนี้เพื่อเริ่มต้นgnubiffใน~/.xprofile
กรณีที่คุณมีการเชื่อมต่ออินเทอร์เน็ตเท่านั้น
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 &
Pong ไม่ได้หมายความว่าบริการเว็บบนเซิร์ฟเวอร์กำลังทำงานอยู่ เป็นเพียงหมายความว่าเซิร์ฟเวอร์ตอบกลับ ICMP echo ฉันอยากจะแนะนำให้ใช้ curl และตรวจสอบค่าส่งคืน
หากเป้าหมายของคุณคือการตรวจสอบการเข้าถึงอินเทอร์เน็ตจริง ๆคำตอบที่มีอยู่จำนวนมากสำหรับคำถามนี้มีข้อบกพร่อง บางสิ่งที่คุณควรทราบ:
ด้วยเหตุนี้ฉันจึงเชื่อว่ากลยุทธ์ที่ดีที่สุดคือการติดต่อหลายไซต์ผ่านการเชื่อมต่อ HTTPS และส่งคืนจริงหากไซต์เหล่านั้นตอบสนอง
ตัวอย่างเช่น:
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;
รหัสตอบแทนสำหรับขดมีการทดสอบในบรรทัดที่จะกล่าวว่า ไม่รู้ว่าทำไมถึงไม่ทำงานในระบบของคุณ แน่ใจนะว่าใช้ทุบตี?
wait
ธรรมดาดังนั้นฉันจึงอ่านต่อและตอนนี้เข้าใจว่าโค้ดส่งคืนกำลังได้รับการทดสอบ ฉันคัดลอกรหัสของคุณอีกครั้งและวันนี้ก็ใช้ได้ - อ๊ะ! คราวที่แล้วฉันต้องทำอะไรบางอย่างวุ่นวายแม้ว่าฉันจะไม่เข้าใจว่าอะไรหรืออย่างไร อย่างไรก็ตาม mea culpa ขอโทษ.
สิ่งนี้เร็วกว่าโซลูชันใด ๆ ที่โพสต์ไว้ที่นี่อย่างเห็นได้ชัดและสามารถใช้เพื่อทดสอบโฮสต์เฉพาะได้ด้วย
เคล็ดลับคือการแก้ IP โดยใช้ตัวแก้ DNS ที่ยุ่งน้อยกว่าที่ใช้โดย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
}