Bagaimana cara saya memeriksa konektivitas Internet di konsol?

31

Apakah ada cara mudah untuk memeriksa konektivitas Internet dari konsol? Saya mencoba untuk bermain-main dalam skrip shell. Satu ide yang tampaknya saya lakukan adalah dan memeriksa kode respons HTTP untuk menafsirkan jika koneksi Internet berfungsi dengan baik. Tapi saya pikir pasti ada cara mudah tanpa perlu memeriksa situs yang tidak pernah macet;)wget --spider http://www.google.co.in/

Sunting: Sepertinya ada banyak faktor yang dapat diperiksa secara individual, hal yang baik. Niat saya saat ini adalah untuk memeriksa apakah blog saya rusak. Saya memiliki pengaturan cron untuk memeriksanya setiap menit. Untuk ini, saya memeriksa kode respons HTTP dari wget --spider ke blog saya. Jika tidak 200, itu memberi tahu saya (saya percaya ini akan lebih baik daripada hanya melakukan ping, karena situs mungkin di bawah beban berat dan mungkin waktu keluar atau merespons sangat terlambat). Sekarang kemarin, ada beberapa masalah dengan Internet saya. LAN terhubung dengan baik tetapi saya tidak bisa mengakses situs apa pun. Jadi saya terus mendapatkan notifikasi karena skrip tidak dapat menemukan 200 di respons wget. Sekarang saya ingin memastikan bahwa itu menampilkan pemberitahuan kepada saya ketika saya memiliki konektivitas internet.

Jadi, memeriksa konektivitas DNS dan LAN agak berlebihan bagi saya karena saya tidak memiliki kebutuhan khusus untuk mencari tahu apa masalahnya. Jadi apa yang Anda sarankan bagaimana saya melakukannya?

Berikut ini skrip saya untuk terus memeriksa downtime untuk blog saya:

#!/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

Dengan cara ini saya perlu memeriksa konektivitas internet hanya jika ada masalah dengan kode respons blog saya. Agak berat (karena saya tidak menggunakan ping) tetapi tidak boleh memberikan positif palsu. Kanan? Juga bagaimana saya dapat mengacak ping ke situs yang berbeda setiap kali, seperti facebook, google, yahoo dll. Juga (saya mencoba menghindari I / O) Saya dapat menulis ke file log yang dengannya saya dapat memeriksa jumlah pemeriksaan downtime dan kemudian lewati pemeriksaan lebih lanjut hingga situs turun atau menyebabkan pemeriksaan lebih lama (10 menit alih-alih setiap menit). Apa yang kamu pikirkan?

Asfame
sumber
"Konektivitas internet" tidak memiliki definisi yang jelas, Anda hanya dapat menguji konektivitas ke layanan tertentu atau serangkaian layanan. Jika maksud Anda konektivitas "LAN", pilihan yang baik adalah dengan melakukan ping ke gateway jaringan Anda.
João Pinto
Dalam istilah awam, saya akan mendefinisikan konektivitas internet jika Anda dapat mengakses internet. Masalah bisa dengan apa saja di antaranya. Saya hanya perlu membedakan antara apakah itu berfungsi dengan baik atau ada masalah di luar rangkaian masalah yang bisa bertanggung jawab. Saya harap saya membuat diri saya jelas. :)
Ashfame

Jawaban:

29

Memeriksa apakah situs web tertentu sudah habis

Pertama, tersedia beberapa layanan pemantauan online yang bagus. Untuk memilih satu, Pingdom menyertakan akun gratis untuk memantau satu target. (Penafian: Saya tidak berafiliasi dengan Pingdom dengan cara apa pun).

Kedua, menggunakan wget --spiderskrip Anda sendiri adalah ide yang bagus. Anda akan mendapatkan beberapa kesalahan positif saat komputer Anda mati, atau ketika server DNS Anda tidak berfungsi. Memeriksa kode pengembalian adalah cara mudah untuk mengimplementasikannya:

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

Sekali lagi, ada kekurangan dalam pendekatan ini. Jika penyedia Anda telah merekam cache DNS Anda, tetapi server DNSnya rusak, yang lain tidak dapat mengakses situs Anda meskipun pemantauan mengatakan semuanya baik-baik saja. Anda dapat menulis solusi singkat dengan host, misalnya host example.com <your dns server IP>. Itu akan mengembalikan kesalahan jika server DNS tidak merespons, bahkan jika OpenDNS atau server DNS penyedia Anda berfungsi dengan baik.

Memeriksa apakah internet berfungsi

Tidak ada cara mudah untuk menangani ini dalam setiap kasus.

Misalnya Anda dapat berjalan ping -c1di beberapa situs terkenal (misalnya www.google.com, facebook.com, dan ping.funet.fi) dan memeriksa kode pengembalian untuk menentukan apakah tujuan apa pun dapat dijangkau. Anda dapat secara otomatis memeriksa kode pengembalian dengan menggunakan variabel $?. Parameter -c1membatasi jumlah paket ping menjadi satu.

Anda mungkin mengalami masalah dengan beberapa wifis publik ketika ada gateway masuk yang mengarahkan ulang semua ping dan permintaan HTTP. Jika demikian, Anda dapat memperoleh respons ping dan kode status HTTP non-kesalahan, bahkan ketika Anda tidak dapat mengakses situs lain.

Jika Anda ingin memeriksa status kabel, Anda dapat menggunakan

sudo ethtool eth0

Dari output (kutipan):

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

Namun, ini tidak memberi tahu apakah Anda benar-benar memiliki konektivitas atau tidak, hanya apakah kabel tersambung dan ada sesuatu di ujung lainnya.

Olli
sumber
Ini sepenuhnya untuk pengaturan saya, bekerja pada Always-ON Ethernet. Tapi senang bahwa Anda menunjukkan bagaimana itu tidak akan berfungsi dengan benar dalam beberapa kasus. Saya juga percaya ping akan lebih cepat dari wget. Apa yang kamu pikirkan? dan jika saya memeriksa kode status 200 di mana saja, saya lebih suka hanya ping itu. Kanan? atau ada sesuatu yang harus saya ketahui?
Ashfame
2
ping lebih cepat, dan lebih baik, karena ujung yang lain tidak akan marah kepada Anda. ping cukup aman, tetapi bahkan itu tidak menjamin bahwa Anda dapat membuka halaman web. Juga, ada kemungkinan firewall memblokir ping tetapi mengizinkan permintaan HTTP.
Olli
1
Mem-ping server dns yang terkenal seperti 4.2.2.2 juga berguna jika Anda memiliki konektivitas net tetapi dns rusak.
djeikyb
Untuk pemeriksaan DNS tentu saja Anda dapat menggunakan host(permintaan DNS). Ini sangat cepat juga.
Olli
Terima kasih atas tanggapan Anda @Olli & @djeikyb Saya telah memperbarui pertanyaan, silakan lihat
Ashfame
7

Saya menggunakan metode ini ...

if [["$ (ping -c 1 8.8.8.8 | grep '100% packet loss')"! = ""]]; kemudian
    gema "Internet tidak ada"
    keluar 1
lain
    gema "Internet hadir"
    wget www.site.com
fi
bais bais
sumber
Saya mendapat hasil berbeda untuk ping -c 1 8.8.8.8dan ping -c 1 www.google.com. Bagaimana itu?
MERose
2
Perhatikan bahwa ini akan gagal di Cina dan negara-negara lain yang memblokir Google
Tom J Nowell
7

Saya baru saja digunakan

nm-online

yang berhenti sampai koneksi jaringan hadir oleh manajer jaringan. Bekerja dengan baik. Anda dapat melakukan hal-hal lain dengan itu juga.

rahasia nts
sumber
6

Memeriksa untuk melihat apakah suatu situs sudah habis biasanya dilakukan dengan alat pemantauan seperti nagios. Ini akan terus memantau situs, dan dapat memberi tahu Anda tentang pemadaman.

Saat memeriksa apakah Internet naik dari baris perintah, saya menjalankan beberapa langkah:

  • Periksa Internet aktif ping google.com(periksa DNS dan situs yang dapat dijangkau yang dikenal).
  • Periksa situs web apakah sudah digunakan wgetatau w3muntuk mengambil halaman.

Jika Internet tidak habis, diagnosa lahiriah.

  • Periksa gateway bisa ping. (Periksa ifconfig untuk alamat gateway.)
  • Periksa server DNS dapat ping. (Periksa /etc/resolv.conf untuk alamat.)
  • Periksa untuk melihat apakah firewall memblokir. (Periksa / var / log / syslog ketika saya mencatat blok.)

Jika Internet naik tetapi situs turun periksa dengan w3m http://isup.me/example.commengganti example.comdengan situs yang muncul. Gunakan wget, lynx, atau browser baris perintah mana pun yang Anda miliki jika Anda tidak menginstal browser w3m.

BillThor
sumber
Terima kasih atas saran Anda! Apakah skrip saya mencakup persyaratan dasar untuk memeriksa dan mengingatkan saya ketika situs saya mati? Dan itu akan menjadi tenang jika ada beberapa masalah konektivitas Internet
Ashfame
Sepertinya skrip Anda akan melakukan apa yang Anda inginkan. Anda bisa memasukkan perintah wget dalam pernyataan if sebagai if ! wget --spider http:///example.com; then.
BillThor
maksudmu wget selalu mengembalikan 1 untuk 200 kode respons HTTP?
Ashfame
Maksud saya tes [ $? != 0 ]ini sama dengan tes ! command. wget didokumentasikan untuk mengembalikan 0 pada keberhasilan dan bukan 0 untuk kegagalan. Jika berperilaku identik cara yang pernah Anda kode itu. Jika wget mengembalikan kegagalan pada respons 200, tes akan gagal jika Anda menulisnya. Sama jika mengembalikan 0 untuk kode respons selain 200.
BillThor
Terima kasih! Itu akan membuat skrip lebih kecil dan mudah dimengerti.
Ashfame
4

Ini adalah shell shell yang saya gunakan untuk menguji konektivitas internet:

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

Anda harus menginstal curl dan mpg321

sudo apt-get install curl mpg321

Anda akan memerlukan file suara .mp3 yang diubah namanya menjadi alarm.mp3 di folder yang sama jika Anda ingin fungsi alarm yang dapat didengar. Akhirnya konfigurasikan URL situs web dan egrep sesuai kebutuhan Anda.

01BTC10
sumber
Ini berfungsi dengan baik bahkan ketika pengguna berada di belakang portal tawanan dan belum masuk.
Ashhar Hasan
Anda dapat menggunakan egrep -qsebagai gantinyaegrep ... > /dev/null
wjandrea
Mengapa skrip memanggil dirinya sendiri, bukan hanya menggunakan whileloop?
wjandrea
Oh, tunggu, itu tidak menyebut dirinya. Itu memanggil sebuah skrip yang disebut alarm.shdi wd, jadi jika Anda memanggil skrip ini dari dir yang berbeda, itu akan salah, atau jika ada skrip yang dipanggil alarm.shdi wd, itu akan memanggil itu sebagai gantinya. Jadi itu praktik buruk. Anda bisa menggunakannya "$0"sebagai gantinya, tetapi satu whilelingkaran akan lebih baik.
wjandrea
"Mengapa skrip menyebut dirinya sendiri alih-alih hanya menggunakan loop sementara?": Karena saya adalah noobs ketika saya membuat posting itu dan ya skrip itu memanggil dirinya sendiri.
01BTC10
2

Memeriksa apakah internet berfungsi

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

Dari output (kutipan):

1 #System is connected to internet

Namun, seperti yang disebutkan oleh orang lain, ini tidak memberi tahu apakah Anda benar-benar memiliki konektivitas atau tidak. Misalnya. Anda dapat terhubung ke router dan router belum tentu terhubung ke internet.

Venkat Kotra
sumber
2
nm-tooltelah dihapus di Ubuntu 15.04+, tetapi Anda dapat menggunakannya nmclisebagai gantinya. Misalnya[[ $(nmcli -f STATE -t g) = connected ]]
Enam
@Six nmcli -f STATE -t nmHal baiknya adalah independen dari situs web!
Aquarius Power
1
Catat itu nm-tooldan hanya nmcliakan memberi tahu Anda apakah Anda terhubung ke jaringan lokal atau tidak, yaitu apakah Anda terhubung ke wifi / ethernet rumah Anda atau tidak. Ini tidak akan memberi tahu Anda apakah Anda dapat menjangkau sesuatu di luar jaringan lokal Anda, yaitu internet.
Sergiy Kolodyazhnyy
1

Saya menggunakan metode ini:

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

Itu akan mencoba untuk terhubung ke situs web terkenal dan jika itu dapat terhubung ke sana maka kita akan menganggap ada internet.

Abraham Hernandez
sumber
0

Saya membutuhkan bantuan dengan pertanyaan yang sama, dan saya mendapatkan jawaban saya seperti ini:

echo $(nm-online) $? connection problems
octius4u
sumber
bagaimana cara kerjanya?
wjandrea
Itu hanya memeriksa status (satu karakter) dari nm-onlineperintah ... Ini akan mengembalikan 0 jika semuanya baik-baik saja. Biasa di semua UNIXkerang.
Antonio
0

Memeriksa apakah Internet berfungsi tidak sepele. ping adalah ICMP, jadi mungkin berfungsi bahkan jika proxy web sedang down. Hal serupa terjadi dengan DNS jika Anda menguji dengan IP.

Karena koneksi internet saya tidak stabil saya membuat skrip ini ( berdasarkan yang ini ) yang membuat suara chord yang lembut untuk memanggil saya, dan juga menggunakan Ubuntu memberitahukan ketika koneksi internet kembali:

#!/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;
pabloab
sumber
0

Saya sedang mencari skrip yang akan terus menguji koneksi internet saya, yang akan dimulai setiap kali server saya aktif dan saya membuat ini:

  1. Pertama, instal fping

    apt-get install fping
    
  2. Buat skrip init di folder /etc/init.d dengan konten berikut (saya menyebutnya testcon)

    #!/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. Buat skrip di folder /etc/init.d dengan konten berikut (saya menyebutnya testcond)

    #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" [email protected]
    
    #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" [email protected]
        fi
        #echo Internet is online
        #wait 60 seconds
        sleep 60
            done
    
  4. Kemudian saya menjalankan perintah di bawah ini untuk menambah start-up:

    sudo update-rc.d testcon defaults
    sudo update-rc.d testcon enable
    
  5. Mulai ulang

Rafael
sumber
0

Saya dihadapkan dengan kotoran acak koneksi Wi-Fi oleh Broadcom BCM94331CDchip saya . Saya membuat skrip bash berikut (infinite loop) memeriksa setiap detik jika koneksi Internet Wi-Fi aktif dan berjalan. Baris perintah lain yang diusulkan di sini akan menunggu setidaknya 5 hingga 10 detik sebelum ditutup dengan status yaitu ping. Sementara itu saya mencari solusi yang pasti juga.

Dari hasil di askubuntu, saya harus membersihkan bcmwl-kernel-sourcepaket yang saya gunakan firmware-b43-installerdan b43-fwcutter.

Terima kasih semuanya atas saran mereka (di atas).

Skrip ini perlu ditambahkan dalam Program Start-Up dan tidak perlu super userhak istimewa untuk berjalan juga.

#!/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
Antonio
sumber