Bazı web sitelerine ping atmadan bir internet bağlantısı nasıl test edilebilir? Demek istediğim, ya bir bağlantı varsa ama site kapalıysa? Dünya ile bir bağlantı kontrolü var mı?
Bazı web sitelerine ping atmadan bir internet bağlantısı nasıl test edilebilir? Demek istediğim, ya bir bağlantı varsa ama site kapalıysa? Dünya ile bir bağlantı kontrolü var mı?
Yanıtlar:
Ping olmadan
#!/bin/bash
wget -q --spider http://google.com
if [ $? -eq 0 ]; then
echo "Online"
else
echo "Offline"
fi
-q : Sessiz mod
--spider : alma, sadece sayfa kullanılabilirliğini kontrol et
, $? : kabuk dönüş kodu
0 : shell "Hepsi Tamam" kodu
Wget olmadan
#!/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
emin olmak için zaman aşımı eklemeniz gerekir . gibi bir şeync google.com 80 -w 10
Varsayılan ağ geçidinize ping atı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 }
ve sonra şu şekilde kullanılabilir:ping_gw || (echo "no network, bye" && exit 1)
ifconfig down wlan0
ettim ve hala varsayılan bir ağ geçidim var ve aslında dış dünyaya ulaşamasam da pinglenebilir.
Super Somedrew kullanıcısına buradaki gönderileri için teşekkürler : https://bbs.archlinux.org/viewtopic.php?id=55485 , 2008-09-20 02:09:48
/ Sys / class / net'e bakmak tek yönlü olmalıdır
Geri döngü dışında bir ağ bağlantısını test etmek için komut dosyam burada. Aşağıdakini, web sitemin erişilebilir olup olmadığını düzenli olarak test etmek için sahip olduğum başka bir komut dosyasında kullanıyorum. Erişilmezse, bir açılır pencere beni bir soruna karşı uyarır.
Aşağıdaki komut dosyası, dizüstü bilgisayarım ağa bağlı olmadığında her beş dakikada bir açılır mesaj almamı engelliyor.
#!/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'e yeni başlayanlar için not: Son 'if' ifadesi çevrimiçi DEĞİL [!] İse test eder ve durum buysa çıkar. Daha fazla ayrıntı için man bash bakın ve "İfadeler birleştirilebilir" araması yapın.
Not: Ping'in burada kullanılacak en iyi şey olmadığını düşünüyorum çünkü belirli bir ana bilgisayara olan bağlantıyı test etmeyi hedefliyor , herhangi bir türden bir ağa bağlantı olup olmadığını test etmeyin .
PPS The Above, Ubuntu 12.04'te çalışır. / Sys başka dağıtımlarda bulunmayabilir. Aşağıya bakınız:
Modern Linux dağıtımları, sisteme bağlı aygıtları depolayan ve değiştirmeye izin veren sanal bir dosya sistemi (sysfs, / proc ile karşılaştırılabilir) olarak / sys dizinini içerirken, birçok geleneksel UNIX ve Unix benzeri işletim sistemi / sys, çekirdek kaynak ağacına sembolik bir bağlantı olarak. [kaynak belirtilmeli]
Wikipedia'dan https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard
cat /sys/class/net/wwan0/carrier
2>/dev/null
sonrasına koymak isteyebilirsiniz cat /sys/class/net/$interface/carrier
.
Bu hem MacOSX hem de Linux'ta çalışır:
#!/bin/bash
ping -q -w1 -c1 google.com &>/dev/null && echo online || echo offline
ping: invalid option -- w
fping google.com
ya da sadece fping 8.8.8.8
sihri bir bonusla yapar, test etmeye gerek kalmadan durum kodunu alırsınız (" google.com is alive
") ...
Bash'de, / dev / { udp , tcp } / host / port aracılığıyla ağ sarmalayıcısını kullanarak :
if : >/dev/tcp/8.8.8.8/53; then
echo 'Internet available.'
else
echo 'Offline.'
fi
( :
Bash işlemsizdir, çünkü yalnızca bağlantıyı test etmek istersiniz, ancak işlem yapmazsınız.)
Daha önce komut dosyaları yazdım, bundan önce 80 numaralı bağlantı noktasına bağlanmak için telnet kullanın, ardından metni iletin:
HTTP/1.0 GET /index.html
ardından iki CR / LF dizisi.
Bir tür HTTP yanıtını geri alırsanız, genellikle sitenin çalıştığını varsayabilirsiniz.
En iyi cevap, varsayılan ağ geçidinize mükemmel bir şekilde sabit bir bağlantıya sahip olabileceğiniz gerçeğini gözden kaçırıyor, ancak bu otomatik olarak internetteki bir şeye gerçekten erişebileceğiniz anlamına gelmiyor. OP, dünya ile bir bağı nasıl test edebileceğini sorar. Bu nedenle, ağ geçidi IP'sini LAN'ınız dışındaki bilinen bir IP'ye (xyzw) değiştirerek en iyi yanıtı değiştirmenizi öneririm.
Böylece cevap şu olur:
ping -q -w 1 -c 1 x.y.z.w > /dev/null && echo ok || echo error
Ayrıca, komut ikamesi için istenmeyen geri işaretlerinin kaldırılması [1] .
Bir kodu çalıştırmadan önce dünyaya bağlı olduğunuzdan emin olmak istiyorsanız, şunları da kullanabilirsiniz:
if ping -q -w 1 -c 1 x.y.z.w > /dev/null; then
# more code
fi
ağınızın TCP trafiğine girip çıkmasına izin verdiğinden emin olun, ardından aşağıdaki komutla halka açık IP'nizi geri alabilirsiniz.
curl ifconfig.co
Bir web sitesinin çalışıp çalışmadığını ve web sunucusunun hangi durum mesajını gösterdiğini kontrol etmek için aşağıdaki komutu yürütün:
$ curl -Is http://www.google.com |
head -1 HTTP/1.1 200 OK
Durum kodu '200 Tamam', isteğin başarılı olduğu ve bir web sitesine erişilebilir olduğu anlamına gelir.
curl -Is http://www.google.com | head -1 | grep 200; if [[ $? -eq 0 ]]; then; echo "Online"; else; echo "Offline"; fi;
Yerel ad sunucunuz çalışmıyorsa,
ping 4.2.2.1
hatırlanması kolay, her zaman açık bir IP'dir (aslında bir ad sunucusudur).
En çok oylanan cevap MacOS için çalışmaz, bu yüzden bir Mac kullananlar için bunu başarıyla test ettim:
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'da test edildi
route
komutu olarak değiştirin route -n get default 2> /dev/null | grep gateway
.
Bu bash betiği, İnternet'i sürekli olarak kontrol eder ve İnternet mevcut olduğunda bir bip sesi çıkarır.
#!/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
en kısa yol: fping 4.2.2.1
=> "4.2.2.1 yaşıyor"
daha hızlı ve daha az ayrıntılı çıktı olduğu için bunu tercih ederim ping
, dezavantajı, yüklemeniz gerekecek olmasıdır.
belirli bir web sitesi yerine herhangi bir genel dns kullanabilirsiniz .
fping -q google.com && echo "do something because you're connected!"
-q
bir çıkış kodu döndürür, bu yüzden çevrimiçi olduğunuz bir şeyi çalıştırmanın bir örneğini gösteriyorum.
mac'a kurmak için brew install fping
:; ubuntu'da:sudo apt-get install fping
Benzer için Jesse'nin cevap @ bu seçenek kullanılarak herhangi bir çözümün çok daha hızlı olabilir ping
ve daha belki biraz daha verimli Jesse'nin cevap @ .
find /sys/class/net/ -maxdepth 1 -mindepth 1 ! -name "*lo*" -exec sh -c 'cat "$0"/carrier 2>&1' {} \; | grep -q '1'
Bu komut, find
içinde -exec
adlandırılmayan tüm dosyalarda komut çalıştırmak için with kullanır *lo*
./sys/class/net/
. Bunlar, makinenizdeki mevcut ağ arayüzleri hakkında bilgi içeren dizinlere bağlantılar olmalıdır.
Çalıştırılan sh
komut, carrier
bu dizinlerdeki dosyanın içeriğini kontrol eden bir komuttur . Değerinin $interface/carrier
3 anlamı vardır - Alıntı :
Görünüşe göre üç durum var:
- ./carrier okunamaz (örneğin arabirim Ağ Yöneticisi'nde devre dışı bırakıldığında).
- ./carrier "1" içerir (arayüz etkinleştirildiğinde ve bir WiFi ağına bağlandığında)
- ./carrier "0" içerir (arayüz etkinleştirildiğinde ve bir WiFi ağına bağlı olmadığında)
@ Jesse'nin cevabında ilk seçenek dikkate alınmaz . sh
Dışarı çizgili komut şöyledir:
# Note: $0 == $interface
cat "$0"/carrier 2>&1
cat
carrier
dosya okunabilir olmadığından başarısız olsa bile tüm çıktıların içeriğini kontrol etmek ve standart çıktıya yeniden yönlendirmek için kullanılır . Bu dosyalar arasında bulunursa grep -q
, "1"
bağlı en az 1 arayüz olduğu anlamına gelir. Çıkış kodu grep -q
, son çıkış kodu olacaktır.
Örneğin, bu komutun çıkış durumunu kullanarak , yalnızca internet bağlantınız varsa , bir gnubiff başlatmak için kullanabilirsiniz ~/.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 &
Amacınız İnternet erişimini gerçekten kontrol etmekse, bu soruya verilen mevcut cevapların çoğu kusurludur. Bilmeniz gereken birkaç şey:
Bunu göz önünde bulundurarak, en iyi stratejinin bir HTTPS bağlantısı üzerinden birkaç siteyle iletişim kurmak ve bu sitelerden herhangi biri yanıt verirse doğruyu döndürmek olduğuna inanıyorum .
Örneğin:
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
}
Kullanımı:
if connected_to_internet; then
echo "Connected to internet"
else
echo "No internet connection"
fi
Bu yaklaşımla ilgili bazı notlar:
if wait $pid;
. Sisteminizde neden çalışmadığı hakkında hiçbir fikrim yok. Bash kullandığınızdan emin misiniz?
wait
ve şimdi dönüş kodunun gerçekten test edildiğini anlıyorum. Kodunuzu yeniden kopyaladım ve bugün işe yarıyor - oops! Ne veya nasıl olduğunu anlayamasam da geçen sefer bir şeyleri mahvetmiş olmalıyım. Yine de, mea culpa. Özür.
Bu, burada yayınlanan herhangi bir çözümden çok daha hızlıdır ve belirli bir ana bilgisayarı test etmek için kullanılabilir .
Hile daha az meşgul kullanarak IP çözme DNS çözücüsü tarafından istihdam olandan 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
}