Bagaimana koneksi internet dapat diuji tanpa melakukan ping ke beberapa situs web? Maksud saya, bagaimana jika ada koneksi tetapi situsnya sedang down? Apakah ada pemeriksaan untuk koneksi dengan dunia?
Bagaimana koneksi internet dapat diuji tanpa melakukan ping ke beberapa situs web? Maksud saya, bagaimana jika ada koneksi tetapi situsnya sedang down? Apakah ada pemeriksaan untuk koneksi dengan dunia?
Jawaban:
Tanpa ping
#!/bin/bash
wget -q --spider http://google.com
if [ $? -eq 0 ]; then
echo "Online"
else
echo "Offline"
fi
-q : Mode diam
--spider : jangan sampai, cukup periksa ketersediaan halaman
$? : kode pengembalian shell
0 : kode shell "Semua OK"
Tanpa 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
memastikannya waktu habis. sesuatu sepertinc google.com 80 -w 10
Ping gateway default Anda:
#!/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 }
dan kemudian digunakan seperti ini:ping_gw || (echo "no network, bye" && exit 1)
ifconfig down wlan0
dan saya masih memiliki gateway default dan itu dapat di-ping, meskipun saya sebenarnya tidak dapat menjangkau dunia luar.
Super Terima kasih kepada pengguna somedrew untuk posting mereka di sini: https://bbs.archlinux.org/viewtopic.php?id=55485 pada 2008-09-20 02:09:48
Mencari di / sys / class / net harus menjadi salah satu cara
Berikut skrip saya untuk menguji koneksi jaringan selain loop belakang. Saya menggunakan di bawah ini dalam skrip lain yang saya miliki untuk menguji secara berkala apakah situs web saya dapat diakses. Jika TIDAK dapat diakses, jendela popup memberi tahu saya akan adanya masalah.
Skrip di bawah ini mencegah saya menerima pesan popup setiap lima menit setiap kali laptop saya tidak terhubung ke jaringan.
#!/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
Catatan bagi mereka yang baru mengenal bash: Pernyataan 'jika' terakhir menguji jika TIDAK [!] Online dan keluar jika ini masalahnya. Lihat man bash dan cari "Ekspresi dapat digabungkan" untuk detail selengkapnya.
PS Saya merasa ping bukanlah hal terbaik untuk digunakan di sini karena bertujuan untuk menguji koneksi ke host tertentu BUKAN menguji apakah ada koneksi ke jaringan apa pun.
PPS Di atas berfungsi di Ubuntu 12.04 / sys mungkin tidak ada di beberapa distro lain. Lihat di bawah:
Distribusi Linux modern menyertakan direktori / sys sebagai sistem file virtual (sysfs, sebanding dengan / proc, yang merupakan procfs), yang menyimpan dan memungkinkan modifikasi perangkat yang terhubung ke sistem, sedangkan banyak sistem operasi UNIX tradisional dan mirip Unix menggunakan / sys sebagai tautan simbolis ke pohon sumber kernel. [butuh rujukan]
Dari Wikipedia https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard
cat /sys/class/net/wwan0/carrier
Tidak berfungsi di ubuntu 14.04 LTS.
2>/dev/null
setelah cat /sys/class/net/$interface/carrier
tidak memiliki output kesalahan jika jaringan dinonaktifkan.
Ini berfungsi di MacOSX dan Linux:
#!/bin/bash
ping -q -w1 -c1 google.com &>/dev/null && echo online || echo offline
ping: invalid option -- w
)
fping google.com
atau hanya fping 8.8.8.8
melakukan keajaiban dengan bonus Anda mendapatkan kode status tanpa perlu mengujinya (" google.com is alive
") ...
Di Bash, menggunakan pembungkus jaringannya melalui / dev / { udp , tcp } / host / port :
if : >/dev/tcp/8.8.8.8/53; then
echo 'Internet available.'
else
echo 'Offline.'
fi
( :
adalah Bash no-op, karena Anda hanya ingin menguji koneksi, tetapi tidak memproses.)
Saya telah menulis skrip sebelumnya yang cukup menggunakan telnet untuk terhubung ke port 80, lalu mengirimkan teks:
HTTP/1.0 GET /index.html
diikuti oleh dua urutan CR / LF.
Asalkan Anda mendapatkan kembali beberapa bentuk respons HTTP, Anda biasanya dapat menganggap situs tersebut berfungsi.
Jawaban teratas melewatkan fakta bahwa Anda dapat memiliki koneksi yang sangat stabil ke gateway default Anda, tetapi itu tidak secara otomatis berarti Anda benar-benar dapat menjangkau sesuatu di internet. OP bertanya bagaimana dia bisa menguji koneksi dengan dunia. Jadi saya sarankan untuk mengubah jawaban teratas dengan mengubah IP gateway ke IP yang dikenal (xyzw) yang ada di luar LAN Anda.
Jadi jawabannya adalah:
ping -q -w 1 -c 1 x.y.z.w > /dev/null && echo ok || echo error
Juga menghapus backticks yang tidak disukai untuk substitusi perintah [1] .
Jika Anda hanya ingin memastikan Anda terhubung ke dunia sebelum menjalankan beberapa kode, Anda juga dapat menggunakan:
if ping -q -w 1 -c 1 x.y.z.w > /dev/null; then
# more code
fi
pastikan jaringan Anda mengizinkan lalu lintas TCP masuk dan keluar, lalu Anda bisa mendapatkan kembali IP yang menghadap publik dengan perintah berikut
curl ifconfig.co
Jalankan perintah berikut untuk memeriksa apakah situs web sudah aktif, dan pesan status apa yang ditampilkan server web:
$ curl -Is http://www.google.com |
head -1 HTTP/1.1 200 OK
Kode status '200 OK' berarti permintaan berhasil dan situs web dapat dijangkau.
curl -Is http://www.google.com | head -1 | grep 200; if [[ $? -eq 0 ]]; then; echo "Online"; else; echo "Offline"; fi;
Jika server nama lokal Anda tidak aktif,
ping 4.2.2.1
adalah IP selalu up yang mudah diingat (bahkan sebenarnya server nama).
Jawaban pilihan teratas tidak berfungsi untuk MacOS, jadi bagi mereka yang menggunakan mac, saya berhasil menguji ini:
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
diuji pada MacOS High Sierra 10.12.6
route
perintah untuk route -n get default 2> /dev/null | grep gateway
menghindari penulisan kesalahan ke stderr saat offline.
Skrip bash ini terus menerus memeriksa Internet dan mengeluarkan bunyi bip saat Internet tersedia.
#!/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
cara terpendek: fping 4.2.2.1
=> "4.2.2.1 masih hidup"
Saya lebih suka ini karena lebih cepat dan output yang kurang bertele-tele daripada ping
, downside adalah Anda harus menginstalnya.
Anda dapat menggunakan dns publik apa pun daripada situs web tertentu.
fping -q google.com && echo "do something because you're connected!"
-q
mengembalikan kode keluar, jadi saya hanya menunjukkan contoh menjalankan sesuatu yang Anda sedang online.
untuk menginstal di mac: brew install fping
; di ubuntu:sudo apt-get install fping
Mirip dengan jawaban @ Jesse , opsi ini mungkin jauh lebih cepat daripada solusi apa pun yang digunakan ping
dan mungkin sedikit lebih efisien daripada jawaban @ Jesse .
find /sys/class/net/ -maxdepth 1 -mindepth 1 ! -name "*lo*" -exec sh -c 'cat "$0"/carrier 2>&1' {} \; | grep -q '1'
Perintah ini menggunakan find
dengan -exec
untuk menjalankan perintah pada semua file yang tidak dinamai *lo*
dalam /sys/class/net/
. Ini harus berupa tautan ke direktori yang berisi informasi tentang antarmuka jaringan yang tersedia di mesin Anda.
Perintah yang sedang dijalankan adalah sh
perintah yang memeriksa konten file carrier
di direktori tersebut. Nilai $interface/carrier
memiliki 3 arti - Mengutip :
Tampaknya ada tiga kondisi:
- ./carrier tidak dapat dibaca (misalnya ketika antarmuka dinonaktifkan di Manajer Jaringan).
- ./carrier berisi "1" (ketika antarmuka diaktifkan dan terhubung ke jaringan WiFi)
- ./carrier mengandung "0" (ketika antarmuka diaktifkan dan tidak terhubung ke jaringan WiFi)
Opsi pertama tidak diperhatikan dalam jawaban @ Jesse . The sh
perintah bergaris out adalah:
# Note: $0 == $interface
cat "$0"/carrier 2>&1
cat
sedang digunakan untuk memeriksa konten carrier
dan mengarahkan semua keluaran ke keluaran standar meskipun gagal karena berkas tidak dapat dibaca. Jika grep -q
ditemukan di "1"
antara file-file tersebut, berarti setidaknya ada 1 antarmuka yang terhubung. Kode keluar dari grep -q
akan menjadi kode keluar terakhir.
Misalnya, menggunakan status exit perintah ini, Anda dapat menggunakannya memulai gnubiff di Anda ~/.xprofile
hanya jika Anda memiliki koneksi 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 &
Jika tujuan Anda adalah untuk benar-benar memeriksa akses Internet , banyak dari jawaban yang ada untuk pertanyaan ini yang cacat. Beberapa hal yang harus Anda perhatikan:
Dengan pemikiran tersebut, saya yakin strategi terbaik adalah menghubungi beberapa situs melalui koneksi HTTPS dan mengembalikan true jika salah satu situs tersebut merespons.
Sebagai contoh:
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
}
Pemakaian:
if connected_to_internet; then
echo "Connected to internet"
else
echo "No internet connection"
fi
Beberapa catatan tentang pendekatan ini:
if wait $pid;
. Tidak tahu mengapa itu tidak berfungsi di sistem Anda. Apakah Anda yakin Anda menggunakan bash?
wait
dan sekarang memahami kode pengembalian memang sedang diuji. Saya menyalin ulang kode Anda dan hari ini berhasil - ups! Saya pasti telah mengacaukan sesuatu terakhir kali meskipun saya tidak mengerti apa atau bagaimana. Meski begitu, mea culpa. Permintaan maaf.
Ini terutama lebih cepat daripada solusi apa pun yang diposting di sini, dan dapat digunakan untuk menguji host tertentu juga.
Triknya adalah menyelesaikan IP menggunakan pemecah DNS yang tidak terlalu sibuk daripada yang digunakan oleh 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
}