Làm cách nào để kiểm tra kết nối internet mà không cần ping một số trang web? Ý tôi là, nếu có kết nối nhưng trang web không hoạt động thì sao? Có kiểm tra kết nối với thế giới không?
Làm cách nào để kiểm tra kết nối internet mà không cần ping một số trang web? Ý tôi là, nếu có kết nối nhưng trang web không hoạt động thì sao? Có kiểm tra kết nối với thế giới không?
Câu trả lời:
Không cần ping
#!/bin/bash
wget -q --spider http://google.com
if [ $? -eq 0 ]; then
echo "Online"
else
echo "Offline"
fi
-q : Chế độ im lặng
--spider : không nhận, chỉ cần kiểm tra tính khả dụng của trang
$?: mã trả lại shell
0 : mã shell "Tất cả OK"
Không có 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
để đảm bảo hết thời gian. một cái gì đó giống nhưnc google.com 80 -w 10
Ping cổng mặc định của bạn:
#!/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 }
và sau đó sử dụng như sau:ping_gw || (echo "no network, bye" && exit 1)
ifconfig down wlan0
và tôi vẫn có một cổng mặc định và nó có thể ping được, mặc dù trên thực tế tôi không thể tiếp cận thế giới bên ngoài.
Cảm ơn người dùng somedrew cho bài đăng của họ ở đây: https://bbs.archlinux.org/viewtopic.php?id=55485 vào 2008-09-20 02:09:48
Tìm kiếm trong / sys / class / net phải là một cách
Đây là tập lệnh của tôi để kiểm tra kết nối mạng không phải là vòng lặp trở lại. Tôi sử dụng phần bên dưới trong một tập lệnh khác mà tôi có để kiểm tra định kỳ xem trang web của tôi có thể truy cập được hay không. Nếu nó KHÔNG thể truy cập được, một cửa sổ bật lên sẽ cảnh báo cho tôi về sự cố.
Tập lệnh bên dưới ngăn tôi nhận thông báo bật lên sau mỗi năm phút bất cứ khi nào máy tính xách tay của tôi không được kết nối với mạng.
#!/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
Lưu ý cho những người mới sử dụng bash: Câu lệnh 'if' cuối cùng kiểm tra nếu KHÔNG phải [!] Trực tuyến và thoát ra nếu đúng như vậy. Xem man bash và tìm kiếm "Biểu thức có thể được kết hợp" để biết thêm chi tiết.
Tái bút Tôi cảm thấy ping không phải là thứ tốt nhất để sử dụng ở đây vì nó nhằm mục đích kiểm tra kết nối với một máy chủ cụ thể KHÔNG kiểm tra xem có kết nối với mạng thuộc bất kỳ loại nào không.
PPS Ở trên hoạt động trên Ubuntu 12.04 / sys có thể không tồn tại trên một số bản phân phối khác. Xem bên dưới:
Các bản phân phối Linux hiện đại bao gồm thư mục / sys như một hệ thống tệp ảo (sysfs, có thể so sánh với / proc, là một procfs), lưu trữ và cho phép sửa đổi các thiết bị được kết nối với hệ thống, trong khi nhiều hệ điều hành giống UNIX và Unix truyền thống sử dụng / sys như một liên kết tượng trưng đến cây nguồn hạt nhân. [cần dẫn nguồn]
Từ Wikipedia https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard
cat /sys/class/net/wwan0/carrier
Không hoạt động trên ubuntu 14.04 LTS.
2>/dev/null
sau cat /sys/class/net/$interface/carrier
để không xuất hiện lỗi trong trường hợp mạng bị tắt.
Điều này hoạt động trên cả MacOSX và Linux:
#!/bin/bash
ping -q -w1 -c1 google.com &>/dev/null && echo online || echo offline
ping: invalid option -- w
)
fping google.com
hoặc đơn giản là fping 8.8.8.8
thực hiện điều kỳ diệu với phần thưởng bạn nhận được mã trạng thái mà không cần phải kiểm tra nó (" google.com is alive
") ...
Trong Bash, sử dụng trình bao bọc mạng của nó thông qua / dev / { udp , tcp } / host / port :
if : >/dev/tcp/8.8.8.8/53; then
echo 'Internet available.'
else
echo 'Offline.'
fi
( :
là Bash no-op, vì bạn chỉ muốn kiểm tra kết nối chứ không muốn xử lý.)
Tôi đã viết script trước đó chỉ cần sử dụng telnet để kết nối với cổng 80, sau đó truyền văn bản:
HTTP/1.0 GET /index.html
tiếp theo là hai chuỗi CR / LF.
Với điều kiện bạn nhận lại một số dạng phản hồi HTTP, bạn thường có thể cho rằng trang web đang hoạt động.
Câu trả lời hàng đầu bỏ sót thực tế là bạn có thể có kết nối hoàn toàn ổn định với cổng mặc định của mình nhưng điều đó không tự động có nghĩa là bạn thực sự có thể truy cập một thứ gì đó trên internet. OP hỏi làm thế nào anh / cô ấy có thể kiểm tra kết nối với thế giới. Vì vậy, tôi khuyên bạn nên thay đổi câu trả lời hàng đầu bằng cách thay đổi IP cổng thành một IP đã biết (xyzw) nằm ngoài mạng LAN của bạn.
Vì vậy, câu trả lời sẽ trở thành:
ping -q -w 1 -c 1 x.y.z.w > /dev/null && echo ok || echo error
Đồng thời loại bỏ các dấu gạch ngược không có vị trí để thay thế lệnh [1] .
Nếu bạn chỉ muốn đảm bảo rằng bạn được kết nối với thế giới trước khi thực thi một số mã, bạn cũng có thể sử dụng:
if ping -q -w 1 -c 1 x.y.z.w > /dev/null; then
# more code
fi
đảm bảo mạng của bạn cho phép lưu lượng TCP vào và ra, sau đó bạn có thể lấy lại IP công khai của mình bằng lệnh sau
curl ifconfig.co
Thực thi lệnh sau để kiểm tra xem một trang web có hoạt động hay không và máy chủ web đang hiển thị thông báo trạng thái nào:
$ curl -Is http://www.google.com |
head -1 HTTP/1.1 200 OK
Mã trạng thái '200 OK' có nghĩa là yêu cầu đã thành công và một trang web có thể truy cập được.
curl -Is http://www.google.com | head -1 | grep 200; if [[ $? -eq 0 ]]; then; echo "Online"; else; echo "Offline"; fi;
Nếu máy chủ định danh cục bộ của bạn gặp sự cố,
ping 4.2.2.1
là một IP luôn cập nhật dễ nhớ (thậm chí nó còn là một máy chủ định danh).
Các top bình chọn câu trả lời không làm việc cho hệ điều hành MacOS như vậy cho những người trên một mac, tôi đã thử nghiệm thành công này:
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
đã thử nghiệm trên MacOS High Sierra 10.12.6
route
lệnh để route -n get default 2> /dev/null | grep gateway
tránh ghi lỗi vào stderr khi ngoại tuyến.
Tập lệnh bash này liên tục kiểm tra Internet và phát ra âm thanh bíp khi Internet khả dụng.
#!/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
cách ngắn nhất: fping 4.2.2.1
=> "4.2.2.1 còn sống"
Tôi thích điều này hơn vì nó nhanh hơn và đầu ra ít dài dòng hơn ping
, nhược điểm là bạn sẽ phải cài đặt nó.
bạn có thể sử dụng bất kỳ dns công cộng nào thay vì một trang web cụ thể.
fping -q google.com && echo "do something because you're connected!"
-q
trả về mã thoát, vì vậy tôi chỉ hiển thị một ví dụ về việc bạn đang chạy thứ gì đó trực tuyến.
để cài đặt trên mac : brew install fping
; trên ubuntu:sudo apt-get install fping
Tương tự như câu trả lời của @ Jesse , tùy chọn này có thể nhanh hơn nhiều so với bất kỳ giải pháp nào đang sử dụng ping
và có lẽ hiệu quả hơn một chút so với câu trả lời của @ Jesse .
find /sys/class/net/ -maxdepth 1 -mindepth 1 ! -name "*lo*" -exec sh -c 'cat "$0"/carrier 2>&1' {} \; | grep -q '1'
Lệnh này sử dụng lệnh find
with -exec
để chạy trên tất cả các tệp không có tên *lo*
trong/sys/class/net/
. Đây phải là các liên kết đến các thư mục chứa thông tin về các giao diện mạng có sẵn trên máy của bạn.
Lệnh đang được chạy là sh
lệnh kiểm tra nội dung của tệp carrier
trong các thư mục đó. Giá trị của $interface/carrier
có 3 nghĩa - Trích dẫn :
Có vẻ như có ba trạng thái:
- ./carrier không thể đọc được (ví dụ: khi giao diện bị tắt trong Trình quản lý mạng).
- ./carrier chứa "1" (khi giao diện được kích hoạt và nó được kết nối với mạng WiFi)
- ./carrier chứa "0" (khi giao diện được kích hoạt và nó không được kết nối với mạng WiFi)
Lựa chọn đầu tiên không được quan tâm trong câu trả lời của @ Jesse . Các sh
lệnh sọc ra là:
# Note: $0 == $interface
cat "$0"/carrier 2>&1
cat
đang được sử dụng để kiểm tra nội dung của carrier
và chuyển hướng tất cả đầu ra đến đầu ra chuẩn ngay cả khi nó không thành công vì không thể đọc được tệp. Nếu grep -q
tìm thấy "1"
trong số các tệp đó có nghĩa là có ít nhất 1 giao diện được kết nối. Mã thoát của grep -q
sẽ là mã thoát cuối cùng.
Ví dụ: bằng cách sử dụng trạng thái thoát của lệnh này, bạn có thể sử dụng nó để bắt đầu một gnubiff trong ~/.xprofile
chỉ của bạn nếu bạn có kết nối internet.
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 &
Nếu mục tiêu của bạn thực sự là kiểm tra truy cập Internet , thì nhiều câu trả lời hiện có cho câu hỏi này là thiếu sót. Một số điều bạn nên biết:
Với ý nghĩ đó, tôi tin rằng chiến lược tốt nhất là liên hệ với một số trang web qua kết nối HTTPS và trả về true nếu bất kỳ trang web nào phản hồi.
Ví dụ:
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
}
Sử dụng:
if connected_to_internet; then
echo "Connected to internet"
else
echo "No internet connection"
fi
Một số lưu ý về cách tiếp cận này:
if wait $pid;
. Không biết tại sao nó không hoạt động trên hệ thống của bạn. Bạn có chắc mình đang sử dụng bash?
wait
và bây giờ hiểu rằng mã trả về thực sự đang được thử nghiệm. Tôi đã sao chép lại mã của bạn và hôm nay nó hoạt động - rất tiếc! Lần trước chắc tôi đã làm rối tung thứ gì đó mặc dù tôi không thể hiểu cái gì và bằng cách nào. Tuy nhiên, đường cong nhỏ. Xin lỗi.
Điều này nhanh hơn đáng kể so với bất kỳ giải pháp nào được đăng ở đây và có thể được sử dụng để kiểm tra một máy chủ cụ thể .
Thủ thuật là giải quyết IP bằng cách sử dụng bộ giải DNS ít bận hơn so với bộ giải được sử dụng bởi 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
}