Konsoldaki İnternet bağlantısını nasıl kontrol edebilirim?


31

İnternet bağlantısını konsoldan kontrol etmenin kolay bir yolu var mı? Bir kabuk betiğinde oynamaya çalışıyorum. Görünüşe göre , Internet bağlantısının iyi çalışıp çalışmadığını yorumlamak için HTTP yanıt kodunu kontrol etmek ve kontrol etmektir. Ancak bence asla çökmeyen bir siteyi kontrol etmeden kolay bir yol olmalı;)wget --spider http://www.google.co.in/

Düzenleme: Bireysel olarak incelenebilecek birçok faktör olabilir gibi görünüyor, iyi bir şey. Şu andaki niyetim blogumun kapalı olup olmadığını kontrol etmektir. Her dakika kontrol etmek için kurulum cronum var. Bunun için, bloguma wget - spider'in HTTP cevap kodunu kontrol ediyorum. Eğer 200 değilse, beni uyarıyor (site ağır yük altında olabileceğinden ve zaman geçtikçe ya da çok geç cevap verebileceğinden bunun sadece ping yapmaktan daha iyi olacağına inanıyorum). Şimdi dün, İnternet'imle ilgili bir sorun vardı. LAN iyi bağlandı, ancak hiçbir siteye erişemedim. Böylece senaryo wget cevabında 200 bulamadığı için bildirim almaya devam ediyorum. Şimdi internet bağlantım olduğunda bana bildirim gösterdiğinden emin olmak istiyorum.

Bu yüzden, DNS ve LAN bağlantısını kontrol etmek benim için biraz fazla önemli çünkü ne gibi bir problem olduğunu bulmak için özel bir ihtiyaç duymuyorum. Peki nasıl yapmamı önerirsin?

İşte blogumun çalışmama süresini kontrol etmeye devam etmek için senaryom:

#!/bin/bash

# Sending the output of the wget in a variable and not what wget fetches
RESULT=`wget --spider http://blog.ashfame.com 2>&1`
FLAG=0

# Traverse the string considering it as an array of words
for x in $RESULT; do
    if [ "$x" = '200' ]; then
        FLAG=1 # This means all good
    fi
done

if [ $FLAG -eq '0' ]; then
    # A good point is to check if the internet is working or not
        # Check if we have internet connectivity by some other site
        RESULT=`wget --spider http://www.facebook.com 2>&1`
        for x in $RESULT; do
            if [ "$x" = '200' ]; then
                FLAG=1 # This means we do have internet connectivity and the blog is actually down
            fi
        done

    if [ $FLAG -eq '1' ]; then
        DISPLAY=:0 notify-send -t 2000 -i /home/ashfame/Dropbox/Ubuntu/icons/network-idle.png "Downtime Alert!" "http://blog.ashfame.com/ is down."         
    fi  
fi

exit

Bu yolla, yalnızca blog yanıt kodumla ilgili bir sorun olduğunda İnternet bağlantısını kontrol etmem gerekiyor. Biraz ağır (ping kullanmıyorum) ama yanlış bir pozitif vermemeliyim. Sağ? Ayrıca facebook, google, yahoo vb. Gibi her zaman farklı bir siteye ping atmayı nasıl rastgele yapabilirim. daha sonra site kapanana veya daha uzun kontrollere neden olana kadar daha fazla kontrol atlayın (her dakika yerine 10 dakika). Ne düşünüyorsun?


"İnternet bağlantısı" nın net bir tanımı yoktur, yalnızca belirli bir servis veya servisler grubunun bağlantısını test edebilirsiniz. "LAN" bağlantısını kastediyorsanız, ağ geçidinizi pinglemektir.
João Pinto,

Meslekten olmayan terimleriyle, İnternet bağlantısını tanımlayabildiğim, internete erişebildiğiniz anlamına gelir. Sorun, aradaki herhangi bir şey olabilir. İşe yaramadığı ya da sorumlu olabilecek sorun kümesinden bir sorun olup olmadığını ayırt etmem gerekiyor. Umarım kendimi netleştirmişimdir. :)
Ashfame

Yanıtlar:


29

Belirli bir web sitesinin çalışıp çalışmadığını kontrol etme

İlk olarak, çok sayıda iyi çevrimiçi izleme hizmeti mevcuttur. Birini seçmek için, Pingdom bir hedefi izlemek için ücretsiz hesap içerir. (Yasal Uyarı: am değil herhangi bir şekilde Pingdom bağlı).

İkinci olarak, wget --spiderkendi senaryonuz için kullanmak iyi bir fikirdir. Bilgisayarınız kapalı olduğunda veya DNS sunucunuz çalışmadığında bazı yanlış pozitif değerler alırsınız. Dönüş kodunu kontrol etmek, bunu yapmanın basit bir yoludur:

wget --spider --quiet http://example.com
if [ "$?" != 0 ]; then
  echo "Website failed!" | mail -s "Website down" your_email@provider.tld
fi

Yine, bu yaklaşımda eksiklikler var. Sağlayıcınız DNS kaydınızı önbelleğe aldıysa ancak DNS sunucusu kapalıysa, izleme her şeyin yolunda olduğunu söylese bile diğerleri sitenize erişemez. hostÖrneğin, kısa bir geçici çözüm yazabilirsiniz host example.com <your dns server IP>. DNS sunucusu yanıt vermiyorsa, OpenDNS veya kendi sağlayıcınızın DNS sunucusu iyi çalışıyor olsa bile bu hata verir.

İnternetin çalışıp çalışmadığını kontrol etme

Her durumda bununla baş etmenin gerçekten kolay bir yolu yok.

Örneğin ping -c1, çok iyi bilinen sitelerde (örneğin www.google.com, facebook.com ve ping.funet.fi) yayınlanabilir ve herhangi bir hedefin ulaşılabilir olup olmadığını belirlemek için iade kodlarını kontrol edebilirsiniz. Değişken kullanarak dönüş kodunu otomatik olarak kontrol edebilirsiniz $?. Parametre -c1, ping paketlerinin sayısını bir ile sınırlandırıyor.

Tüm ping'leri ve HTTP isteklerini yönlendiren bir giriş ağ geçidi olduğunda, bazı genel wifilerde sorunlarla karşılaşabilirsiniz. Öyleyse, başka sitelere erişemeseniz bile ping yanıtları ve hatalı HTTP durum kodları alabilirsiniz.

Kablo durumunu kontrol etmek istiyorsanız,

sudo ethtool eth0

Çıkıştan (alıntı):

Speed: 1000Mb/s
Duplex: Full
Port: Twisted Pair
Link detected: yes

Ancak, bu gerçekten bağlantınızın olup olmadığını, sadece kablonun bağlı olup olmadığını ve diğer ucunda bir şey olup olmadığını söylemez .


Bu tamamen Kurulum için, Her Zaman AÇIK Ethernet üzerinde çalışıyor. Ancak, bazı durumlarda doğru şekilde çalışmayacağını belirttiğinize sevindim. Ayrıca, ping uygulamasının wget'den daha hızlı olacağına inanıyorum. Ne düşünüyorsun? ve herhangi bir yerde 200 durum kodunu kontrol ediyorsam, sadece ping yapmak isterdim. Sağ? ya da bilmem gereken bir şey var mı?
Ashfame

2
ping daha hızlı ve daha iyidir, çünkü diğer son size kızmaz. ping oldukça güvenlidir, ancak bu bile web sayfalarını açabileceğinizi garanti etmez. Ayrıca, güvenlik duvarının ping'i engellediği, ancak HTTP isteklerine izin verdiği mümkündür .
Olli

1
Tanınmış bir dns sunucusuna 4.2.2.2 gibi ping işlemi yapmak, aynı zamanda net bağlantınız varsa, ancak dns kopmuşsa kullanışlıdır.
djeikyb

DNS kontrolü için elbette kullanabilirsiniz host(DNS sorgusu). Aynı zamanda çok hızlı.
Olli

Cevabınız için teşekkürler @Olli & @djeikyb Soruyu güncelledim, lütfen bir göz atın
Ashfame

7

Bu yöntemi kullanıyorum ...

eğer [["$ (ping -c 1 8.8.8.8 | grep '% 100 paket kaybı')"! = ""]]; sonra
    yankı "İnternet yok"
    çıkış 1
Başka
    yankı "İnternet var"
    wget www.site.com
fi

Ben farklı sonuçlar aldık ping -c 1 8.8.8.8ve ping -c 1 www.google.com. Bu nasıl?
MERose

2
Çin’de ve Google’ı engelleyen diğer ülkelerde bunun başarısız olacağını unutmayın
Tom J Nowell

7

Az önce kullandım

nm-online

ağ yöneticisi ağ yöneticisi tarafından mevcut olana kadar duraklatır. İyi çalıştı. Onunla başka şeyler de yapabilirsin.


6

Bir sitenin kurulup kurulmadığını kontrol etmek genellikle benzer bir izleme aracıyla yapılır nagios. Bu, siteyi sürekli olarak izler ve kesintileri size bildirir.

İnternet'in komut satırından kalkıp kalkmadığını kontrol ederken birkaç adımla geçtim:

  • İnternetin çalışır durumda olduğunu ping google.comkontrol edin (DNS’i ve ulaşılabilir siteyi kontrol eder).
  • Web sitesinin kullanımda olup olmadığını kontrol edin wgetveya w3msayfa alın.

İnternet açık değilse, dışa doğru teşhis koyun.

  • Ağ geçidinin pingable olup olmadığını kontrol edin. (Ağ geçidi adresi için ifconfig kontrol edin.)
  • DNS sunucularının pingable olup olmadığını kontrol edin. (Adresleri için /etc/resolv.conf dosyasını kontrol edin.)
  • Güvenlik duvarının engellenip engellenmediğini kontrol edin. (Blokları kaydederken / var / log / syslog komutunu kontrol edin.)

İnternet çalışıyorsa ancak site kapalıysa , görünen siteyle w3m http://isup.me/example.comdeğiştirmeyi kontrol edin example.com. W3m tarayıcınız yoksa, wget, lynx veya hangi komut satırı tarayıcısını kullanabilirsiniz.


Önerin için teşekkürler! Senaryom, sitem kapalıyken beni kontrol etmenin ve uyarmanın temel şartını içeriyor mu? İnternet bağlantısı problemi olması durumunda sessiz olacak
Ashfame

Senaryonun istediğini yapacak gibi görünüyor. Wget komutunu if ifadesine dahil edebilirsiniz if ! wget --spider http:///example.com; then.
BillThor

wget, 200 HTTP cevap kodu için her zaman 1 döndürür mü demek istiyorsunuz?
Ashfame

Test [ $? != 0 ], test ile aynı ! command. wget, başarısızlık durumunda 0 değil başarı durumunda 0 döndürülür. İf, hangi şekilde kodlayacağınızla aynı şekilde davranır. Wget 200 yanıtında başarısızlık verirse, test yazdığınız şekilde başarısız olur. Aynı durum 200 dışında bir yanıt kodu için 0 döndürürse.
BillThor

Teşekkürler! Bu senaryoyu daha küçük ve anlaşılması kolay hale getirir.
Ashfame

4

Bu internet bağlantısı için test etmek için kullanıyorum kabuk srcript:

alarm.sh

#! /bin/bash

if curl --silent --head http://www.google.com/ |
    egrep "20[0-9] Found|30[0-9] Found" >/dev/null
then
    echo Internet status: OK
else
    echo Internet status: ERROR
    mpg321 alarm.mp3 &> /dev/null
fi
sleep 60
clear

./alarm.sh

Curl ve mpg321'i yüklemeniz gerekecek

sudo apt-get install curl mpg321

Sesli alarm işlevselliği istiyorsanız, aynı klasörde alarm.mp3 olarak yeniden adlandırılmış bir .mp3 ses dosyasına ihtiyacınız olacak. Sonunda web sitesi URL'sini yapılandırın ve ihtiyaçlarınıza göre egrep.


Bu, kullanıcı esir bir portalın arkasındayken ve giriş yapmadığında bile mükemmel çalışır.
Aşar Hasan

Sen kullanabilirsiniz egrep -qyerineegrep ... > /dev/null
wjandrea

Kod sadece bir whiledöngü kullanmak yerine neden kendisini çağırıyor ?
wjandrea

Oh bekle, kendini aramıyor. alarm.shWd adında bir betiği çağırır , bu yüzden bu betiği farklı bir dir'den çağırırsanız, ya hata yapar veya alarm.shwd içinde bir betiği varsa bunun yerine onu çağırır. Yani bu kötü bir uygulama. Bunun "$0"yerine kullanabilirsiniz , ancak bir whiledöngü daha iyi olurdu.
wjandrea

“Neden sadece bir süre döngüsü kullanmak yerine komut dosyası kendini çağırıyor?”: Çünkü o yazıyı yazarken noobs oldum ve evet, o komut dosyası kendisini çağırıyordu.
01BTC10

2

İnternetin çalışıp çalışmadığını kontrol etme

sudo nm-tool | grep "State: connected" | wc -l

Çıkıştan (alıntı):

1 #System is connected to internet

Ancak, diğerleri tarafından belirtildiği gibi, bu gerçekten bağlantınız olup olmadığını söylemez. Örneğin. Yönlendiriciye bağlanabilir ve yönlendirici mutlaka internete bağlı değildir.


2
nm-toolUbuntu 15.04+ sürümünden kaldırıldı, ancak nmclibunun yerine kullanabilirsiniz . Örn[[ $(nmcli -f STATE -t g) = connected ]]
Altı

@Six nmcli -f STATE -t nmiyi bir şey web sitelerinden bağımsız olmaktır!
Kova Gücü

1
Bunu not et nm-tool ve nmclibağlı olduğunuz sadece olsun ya da olmasın söyleyecektir yerel ağda, yani evinizdeki wifi / ethernet bağlı olduğunuz olsun ya da olmasın. Yerel ağınızın ötesindeki herhangi bir şeye, yani internete ulaşıp ulaşamayacağınızı söylemez.
Sergiy Kolodyazhnyy

1

Bu yöntemi kullanıyorum:

if curl -s --head  --request GET www.google.com | grep "200 OK" > /dev/null ; then
    echo "Internet is present"
else
    echo "Internet isn't present"
fi

İyi bilinen bir web sitesine bağlanmayı deneyecek ve eğer bağlanabiliyorsa internet olduğunu varsayacağız.


0

Aynı soru için yardıma ihtiyacım vardı ve bu şekilde cevabımı aldım:

echo $(nm-online) $? connection problems

bu nasıl çalışıyor?
wjandrea

Sadece nm-onlinekomutun durumunu (bir karakter) kontrol ediyor ... Her şey yolundaysa 0 döndürür. Her UNIXkabuğunda olağandır.
Antonio

0

İnternetin çalışıp çalışmadığını kontrol etmek çok önemsiz değildir. ping ICMP'dir, bu yüzden web proxy'si kapalı olsa bile çalışabilir. IP ile test ederseniz, DNS ile benzer bir şey oluşur.

İnternet bağlantım kararsız olduğundan, beni aramak için yumuşak bir akor sesi çıkaran bu betiği (buna göre ) oluşturdum ve ayrıca İnternet bağlantısı geri geldiğinde Ubuntu bildirimini kullanır:

#!/bin/bash

hash play 2>&- || { echo >&2 "I require «play» but it's not installed. Try apt-get install sox. Aborting."; exit 1; }

WGET="`which wget`"
URL="http://www.google.com"
delay=3;
noConnectionMessage="No connection, trying again in $delay seconds...";
connectionMessage="WE HAVE INTERNET! :) Trying again in $delay seconds...";

echo "INTERNET TESTER: Type Ctrl+C to quit";
rm --force /tmp/index.site

function playSound {
    time=1;    # Time played
    if [ `sox --version| grep -oP "v[0-9.]+" | sed "s/[v.]//g"` -lt 1431 ]; then    #analize sox version, if greater than v14.3.1 can use pluck
        play -q -n synth $time sine;
    else
        play -q -n synth $time pluck $1;
        #for i in G4 G4 G4 E4;do play -n synth 0.1 pluck $i repeat 2;done    # You can play with something like this also :) (first three notes from Beethoven 5th symphony)
    fi
}

while [ 1 -eq 1 ]; do
    $WGET -q --tries=10 --timeout=2 $URL -O /tmp/index.site &> /dev/null
    if [ ! -s /tmp/index.site ];then
        echo $noConnectionMessage;
        #playSound E2
        sleep 1;
    else
        #~ zenity --warning --text "ADDRESS is back"
        notify-send -i "notification-network-wireless-full" "Connection state:" "$connectionMessage";
        echo $connectionMessage;
        playSound E3
    fi
    sleep $delay;
done

exit 0;

0

İnternet bağlantımı sürekli test edecek bir komut dosyası arıyordum, sunucum çalışır durumdayken başlayacaktı ve şunu yaptım:

  1. İlk önce, fping'i yükleyin

    apt-get install fping
    
  2. /Etc/init.d klasöründe aşağıdaki içeriğe sahip bir init betiği oluşturun (testcon olarak adlandırdım)

    #!/bin/bash
    
    PIDFILE=/var/run/testcon.pid
    
    . /lib/lsb/init-functions
    
    case "$1" in
      start)
            log_daemon_msg "Starting internet connection tester"
            /etc/init.d/testcond &
            echo $! > $PIDFILE
            log_end_msg $?
        ;;
      stop)
            log_daemon_msg "Stopping internet connection tester"
            PID=$(cat $PIDFILE)
            kill -9 "$PID"
            log_end_msg $?
        ;;
      *)
        echo "Usage: /etc/init.d/testcon {start|stop}"
        exit 1
        ;;
    esac
    
    exit 0
    
  3. /Etc/init.d klasöründe aşağıdaki içeriğe sahip bir script oluşturun (testcond olarak adlandırdım)

    #echo Computer starting or testing daemon init
    while [ "$itest" == "" ] 
    do
        #wait 5 seconds 
        sleep 5
        itest=$(fping 8.8.8.8 | grep alive)
    done
    date | mail -s "Server is up and Internet is online" your_email@gmail.com
    
    #loop forever
    while [ "1" == "1" ] 
    do
        itest=$(fping 8.8.8.8 | grep alive)
        #if internet is down
        if [ "$itest" == "" ] 
        then
            #echo Internet is down
            #log time it was found down
            current_time=$(date)
            echo "Internet was found down @ $current_time" >> /mnt/data/Server/internet_log.txt
            #loop until it is back
            while [ "$itest" == "" ] 
            do
                #wait 60 seconds 
                sleep 60
                itest=$(fping 8.8.8.8 | grep alive) # test the internet
            done
            #when it is back
            current_time=$(date)
            echo "Internet is back        @ $current_time" >> /mnt/data/Server/internet_log.txt
            body=$(tail -2 /mnt/data/Server/internet_log.txt)
            echo "$body" | mail -s "Internet is back online" your_email@gmail.com
        fi
        #echo Internet is online
        #wait 60 seconds
        sleep 60
            done
    
  4. Ardından, devreye girmek için aşağıdaki komutları çalıştırıyorum:

    sudo update-rc.d testcon defaults
    sudo update-rc.d testcon enable
    
  5. Yeniden Başlatma


0

Çipimdeki rastgele Wi-Fi bağlantılarının Broadcom BCM94331CDazalmasıyla karşılaştım. Internet Wi-Fi bağlantısı çalışıyorsa ve her saniye kontrol ederek aşağıdaki bash betiğini (sonsuz döngü) tasarladım. Burada önerilen diğer komut satırı bir durumla kapatılmadan önce en az 5 ila 10 saniye bekleyecektir, yaniping . Bu arada ben de kesin bir çözüm arıyorum.

Askubuntu'daki sonuçlardan, bcmwl-kernel-sourcepaketi kullandıkça temizlemem gerekecek firmware-b43-installerveb43-fwcutter .

Önerileriniz için herkese teşekkür ederiz (yukarıda).

Bu betiğin Başlangıç ​​Programlarına eklenmesi gerekiyor ve super useraynı zamanda çalıştırma ayrıcalığına da gerek yok .

#!/bin/bash
#

# Check if Wi-Fi is disabled e.g. 'out of range'
# If so quickly re-enable Wi-Fi
# Due to a problem with Broadcom proprietary driver in package firmware-b43-installer

# Script is part of Start-Up programs
# Stored in /usr/local/bin/
# Infinite loop checking every second if Wi-Fi is up and running

while true; do
  # https://askubuntu.com/questions/27954/how-can-i-check-internet-connectivity-in-a-console
  if [[ $(nmcli -f STATE -t g) != 'connected' ]]; then
    # Disable and Re-Enable Wi-Fi as the Wi-Fi is now 'out of range' (disconnected)
    nmcli radio wifi off
    nmcli radio wifi on
  fi
  sleep 1
done
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.