बैश के साथ इंटरनेट कनेक्शन का परीक्षण कैसे करें?


113

किसी वेबसाइट को पिंग किए बिना इंटरनेट कनेक्शन का परीक्षण कैसे किया जा सकता है? मेरा मतलब है, क्या होगा अगर कोई कनेक्शन है लेकिन साइट डाउन है? क्या दुनिया के साथ संबंध के लिए कोई जांच है?


2
कई अलग अलग साइटों पिंग?

1
लेकिन मैं वेबसाइटों को पिंग नहीं करना चाहता, कोई अन्य विकल्प नहीं है?
लौरियां

6
मैं बस यह देखना चाहता हूं कि शायद कोई और तरीका हो!
लौरियां

2
किसी एकल पैकेट को भेजने और प्राप्त करने से बेहतर कोई तरीका नहीं है कि आप एक ही बार में ऑफ़लाइन जाना न जानें, दूसरा तरीका यह है कि आप अपने वर्तमान सेट DNS की जांच करें यदि आप नहीं चाहते कि आपका आवेदन अधिक जनता को पिंग करे। डोमेन।
तमारा विज्समैन

14
मैं जानना चाहता हूं कि क्या कोई सुन रहा है, बिना आवाज किए!
काज

जवाबों:


131

बिना पिंग के

#!/bin/bash

wget -q --spider http://google.com

if [ $? -eq 0 ]; then
    echo "Online"
else
    echo "Offline"
fi

-q : साइलेंस मोड

- स्पाइडर : नहीं मिलता है, बस पृष्ठ उपलब्धता की जांच करें

$? : शेल रिटर्न कोड

0 : शेल "ऑल ओके" कोड

बिना विचारे

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

2
बहुत अच्छा ... लेकिन निश्चित रूप से मान लें कि बॉक्स में विकट है। एम्बेडेड डिवाइस और क्या नहीं होगा। ;)
19

5
इसे आज़माएं: echo -e "GET google.com HTTP / 1.0 \ n \ n" | nc google.com 80> / dev / null 2> & 1
user3439968

1
यहाँ tcping भी मदद की होगी। (tcping www.yahoo.com 80) && गूंज "साइट ऊपर है"
डेविड रामिरेज़

अगर / इतर कथन का उपयोग यहां किया गया है तो स्पष्टीकरण बहुत अच्छा है। धन्यवाद !
डेनिजेल-जेम्स डब्ल्यू '

1
@ user3439968 आपको ncयह सुनिश्चित करने के लिए समयबाह्य जोड़ने की आवश्यकता है कि यह समय से बाहर हो। कुछ इस तरहnc google.com 80 -w 10
kaptan

93

अपना डिफ़ॉल्ट गेटवे पिंग करें:

#!/bin/bash
ping -q -w 1 -c 1 `ip r | grep default | cut -d ' ' -f 3` > /dev/null && echo ok || echo error

14
अच्छी तकनीक, इसे किसी फ़ंक्शन में उपयोग करने के लिए संशोधित किया जा सकता है: function ping_gw() { ... && return 0 || return 1 }और फिर इसका उपयोग इस तरह किया जाता है:ping_gw || (echo "no network, bye" && exit 1)
memnoch_proxy

1
मैक ओएस पर यह कॉपी-पेस्ट के माध्यम से काम नहीं करता है: "-बैश: आईपी: कमांड नहीं मिला पिंग: अवैध विकल्प - डब्ल्यू"
बेनेडिकट एस वोगलर

1
यदि कोई वर्चुअलाइजेशन अतिथि से जुड़ा हुआ है, तो एक गलत अलार्म देता है, जबकि होस्ट कनेक्ट नहीं है।
टेरेसा ई जूनियर

1
मुझे प्राथमिक ओएस (0.4.1, एसर एस्पायर ई 15) पर गलत नकारात्मक देता है
मैलकम

1
इससे सावधान रहें। मैंने अभी-अभी यह परीक्षण किया है ifconfig down wlan0और मेरे पास अभी भी एक डिफ़ॉल्ट गेटवे है और यह पिंगेबल है, हालांकि मैं वास्तव में बाहरी दुनिया तक नहीं पहुंच सकता।
ब्रूनो ब्रोंस्की

29

उपयोगकर्ता के लिए सुपर धन्यवाद somedrew उनके पद के लिए यहाँ: https://bbs.archlinux.org/viewtopic.php?id=55485 2008-09-20 02:09:48 पर

/ Sys / class / net में देखना एक तरीका होना चाहिए

यहाँ लूप बैक के अलावा नेटवर्क कनेक्शन के लिए परीक्षण करने के लिए मेरी स्क्रिप्ट है। मैं नीचे किसी अन्य स्क्रिप्ट का उपयोग करता हूं जो मुझे समय-समय पर परीक्षण के लिए है यदि मेरी वेबसाइट सुलभ है। अगर यह सुलभ नहीं है तो पॉपअप विंडो मुझे किसी समस्या से सचेत करती है।

नीचे दी गई स्क्रिप्ट मुझे हर पांच मिनट में पॉपअप संदेश प्राप्त करने से रोकती है जब भी मेरा लैपटॉप नेटवर्क से कनेक्ट नहीं होता है।

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

नोट करने के लिए उन नए के लिए ध्यान दें: अंतिम 'अगर' कथन परीक्षण करता है यदि नहीं [!] ऑनलाइन और बाहर निकलता है अगर यह मामला है। अधिक जानकारी के लिए मैन बैश और "एक्सप्रेशंस को जोड़ा जा सकता है" देखें।

PS मुझे लगता है कि पिंग यहाँ उपयोग करने के लिए सबसे अच्छी बात नहीं है क्योंकि इसका उद्देश्य किसी विशेष प्रकार के होस्ट के कनेक्शन का परीक्षण करना है यदि किसी प्रकार के नेटवर्क से कनेक्शन है

PPS उबंटू 12.04 पर काम करता है / sys कुछ अन्य डिस्ट्रो पर मौजूद नहीं हो सकता है। निचे देखो:

आधुनिक लिनक्स वितरण में वर्चुअल फाइलसिस्टम के रूप में / sys निर्देशिका शामिल है (sysfs, तुलनीय / खरीद के लिए, जो एक खरीद है), जो स्टोर करता है और सिस्टम से जुड़े उपकरणों के संशोधन की अनुमति देता है, जबकि कई पारंपरिक यूनिक्स और यूनिक्स जैसे ऑपरेटिंग सिस्टम का उपयोग करते हैं। / कर्नेल स्रोत ट्री के प्रतीकात्मक लिंक के रूप में sys। [उद्धरण वांछित]

विकिपीडिया से https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard


1
सावधान अब! " cat /sys/class/net/wwan0/carrierUbuntu 14.04 LTS पर काम नहीं करता है।
डॉटनेटकारपेंटर

1
यदि नेटवर्किंग अक्षम है, तो आप त्रुटि आउटपुट नहीं होने के 2>/dev/nullबाद रखना चाह सकते हैं cat /sys/class/net/$interface/carrier
जारो

25

यह MacOSX और Linux दोनों पर काम करता है:

#!/bin/bash

ping -q -w1 -c1 google.com &>/dev/null && echo online || echo offline

ping: invalid option -- w
Osx को

fping google.comया बस fping 8.8.8.8एक बोनस के साथ जादू करता है जिसे आपको परीक्षण करने की आवश्यकता के बिना स्थिति कोड मिलता है (" google.com is alive") ...
रोजर

9

बैश में, यह नेटवर्क आवरण के माध्यम से / dev / { udp , tcp } / host / port का उपयोग करता है :

if : >/dev/tcp/8.8.8.8/53; then
  echo 'Internet available.'
else
  echo 'Offline.'
fi

( :बैश नो-ऑप है, क्योंकि आप केवल कनेक्शन का परीक्षण करना चाहते हैं, लेकिन प्रसंस्करण नहीं।)


7

मैंने पहले स्क्रिप्ट लिखी है कि पोर्ट 80 से कनेक्ट करने के लिए टेलनेट का उपयोग करें, फिर टेक्स्ट ट्रांसमिट करें:

HTTP/1.0 GET /index.html

इसके बाद दो CR / LF क्रम होते हैं।

बशर्ते आपको HTTP प्रतिक्रिया का कुछ रूप वापस मिल जाए, आप आम तौर पर मान सकते हैं कि साइट कार्य कर रही है।


3
पहिया को क्यों मजबूत करें? कर्ल और विग दोनों पूरी तरह से ऐसा करते हैं।
एडम रोसेनफील्ड

6
क्योंकि विग और कर्ल हमेशा उपलब्ध नहीं होते हैं (उदाहरण के लिए, कॉर्पोरेट वातावरण में प्रतिबंध)। टेलनेट समय टी = 0 के बाद से हर यूनिक्स का एक मानक हिस्सा रहा है।
पाक्सिडाब्लो

हाँ, टेलनेटिंग काफी समय से कनेक्शन का परीक्षण करने के लिए एक सुंदर मानक तरीका है।
पीटीबीएनएल

2
अच्छी बात है, हालाँकि wget काफी सामान्य है। एक अन्य विकल्प नेटकैट (एनसी) है, हालांकि इस मामले में यह टेलनेट पर कोई सुधार नहीं है।
एडम रोसेनफील्ड

7

शीर्ष उत्तर इस तथ्य को याद करता है कि आप अपने डिफ़ॉल्ट गेटवे के लिए पूरी तरह से स्थिर कनेक्शन रख सकते हैं लेकिन इसका मतलब यह नहीं है कि आप वास्तव में इंटरनेट पर कुछ तक पहुंच सकते हैं। ओपी पूछता है कि वह दुनिया के साथ संबंध कैसे परख सकता है। इसलिए मैं आपके LAN के बाहर स्थित ज्ञात IP (xyzw) के गेटवे IP को बदलकर शीर्ष उत्तर को बदलने का सुझाव देता हूं।

तो उत्तर बन जाएगा:

ping -q -w 1 -c 1 x.y.z.w > /dev/null && echo ok || echo error

कमांड प्रतिस्थापन [1] के लिए प्रतिकूल बैकटिक्स को हटाना ।

यदि आप केवल यह सुनिश्चित करना चाहते हैं कि आप कुछ कोड निष्पादित करने से पहले दुनिया से जुड़े हैं, तो आप भी उपयोग कर सकते हैं:

if ping -q -w 1 -c 1 x.y.z.w > /dev/null; then
    # more code
fi

6

सुनिश्चित करें कि आपका नेटवर्क टीसीपी ट्रैफ़िक को अंदर और बाहर करने की अनुमति देता है, तो आप निम्नलिखित कमांड के साथ अपने सार्वजनिक आईपी का सामना कर सकते हैं

curl ifconfig.co

5

वेब साइट ऊपर है या नहीं, और वेब सर्वर क्या स्थिति संदेश दिखा रहा है, यह जांचने के लिए निम्न कमांड निष्पादित करें:

$ curl -Is http://www.google.com | head -1 HTTP/1.1 200 OK

स्थिति कोड '200 ओके' का मतलब है कि अनुरोध सफल हो गया है और एक वेबसाइट उपलब्ध है।


2
एक बेहतर कार्यान्वयन हो सकता हैcurl -Is http://www.google.com | head -1 | grep 200; if [[ $? -eq 0 ]]; then; echo "Online"; else; echo "Offline"; fi;
लुका गैलासो

4

यदि आपका स्थानीय नाम नीचे है,

पिंग 4.2.2.1

एक आसानी से याद रखने वाला आईपी है (यह वास्तव में एक नेमवर है, यहां तक ​​कि)।


5
पिंग 8.8.8.8 (Google NS)
user3439968

4

शीर्ष मतदान जवाब इतने पर एक मैक उन लोगों के लिए, मैं सफलतापूर्वक इस परीक्षण किया है MacOS लिए काम नहीं करता:

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

मैकओएस हाई सिएरा 10.12.6 पर परीक्षण किया गया


2
ऑफ़लाइन होने पर stderr में त्रुटि लिखने से बचने के लिए routeकमांड बदलें route -n get default 2> /dev/null | grep gateway
देवस्तफ

4

यह बैश स्क्रिप्ट लगातार इंटरनेट की जांच करती है और इंटरनेट उपलब्ध होने पर एक बीप साउंड बनाती है।

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

3

सबसे छोटा तरीका: fping 4.2.2.1=> "4.2.2.1 जीवित है"

मैं इसे पसंद करता हूं क्योंकि यह तेजी से और कम वर्बोज़ आउटपुट से कम है ping, नकारात्मक पक्ष यह है कि आपको इसे स्थापित करना होगा।

आप किसी विशिष्ट वेबसाइट के बजाय किसी भी सार्वजनिक डीएनएस का उपयोग कर सकते हैं ।

fping -q google.com && echo "do something because you're connected!"

-q एक एग्ज़िट कोड देता है, इसलिए मैं सिर्फ कुछ ऑनलाइन चलाने का एक उदाहरण दिखा रहा हूँ।

मैक पर स्थापित करने के लिए brew install fping:; ubuntu पर:sudo apt-get install fping


2

पिंग को ठीक वही करने के लिए डिज़ाइन किया गया था जो आप करना चाहते हैं। हालाँकि, यदि साइट ICMP की प्रतिध्वनि को रोकती है, तो आप हमेशा टेलनेट को कुछ साइट, विजेट या कर्ल के 80 पोर्ट में कर सकते हैं।


2

Google का इंडेक्स पेज चेक करना एक और तरीका है:

#!/bin/bash

WGET="/usr/bin/wget"

$WGET -q --tries=20 --timeout=10 http://www.google.com -O /tmp/google.idx &> /dev/null
if [ ! -s /tmp/google.idx ]
then
    echo "Not Connected..!"
else
    echo "Connected..!"
fi

2

इसी तरह @ जेसी के जवाब से , यह विकल्प किसी भी समाधान का उपयोग करने की तुलना में बहुत तेज हो सकता है pingऔर शायद @ जेसी के उत्तर की तुलना में थोड़ा अधिक कुशल है ।

find /sys/class/net/ -maxdepth 1 -mindepth 1 ! -name "*lo*" -exec sh -c 'cat "$0"/carrier 2>&1' {} \; | grep -q '1'

Explenation:

यह आदेश का उपयोग करता है findके साथ -execनाम नहीं सभी फाइलों पर कमांड को चलाने के लिए *lo*में /sys/class/net/। ये आपके मशीन पर उपलब्ध नेटवर्क इंटरफेस के बारे में जानकारी रखने वाली निर्देशिकाओं के लिंक होने चाहिए।

चलाया जा रहा कमांड एक shकमांड है जो carrierउन डायरेक्टरी में फाइल के कंटेंट को चेक करता है । मूल्य के $interface/carrier3 अर्थ हैं - उद्धरण :

ऐसा लगता है कि तीन राज्य हैं:

  • ./carrier पठनीय नहीं है (उदाहरण के लिए जब इंटरफ़ेस नेटवर्क मैनेजर में अक्षम है)।
  • ./carrier में "1" होता है (जब इंटरफ़ेस सक्रिय होता है और यह वाईफाई नेटवर्क से जुड़ा होता है)
  • । एयरकार्ट में "0" होता है (जब इंटरफ़ेस सक्रिय होता है और यह वाईफाई नेटवर्क से कनेक्ट नहीं होता है)

@ जेसी के उत्तर में पहले विकल्प का ध्यान नहीं रखा गया है । shआदेश बाहर धारीदार है:

# Note: $0 == $interface
cat "$0"/carrier 2>&1

catका उपयोग किया जा रहा है की सामग्री की जाँच करें carrierऔर सभी आउटपुट को मानक आउटपुट पर पुनर्निर्देशित करें, भले ही वह विफल हो क्योंकि फ़ाइल पठनीय नहीं है। यदि उन फ़ाइलों के बीच grep -qपाता है "1"तो इसका मतलब है कि कम से कम 1 इंटरफ़ेस जुड़ा हुआ है। एग्जिट कोड grep -qअंतिम एग्जिट कोड होगा।

प्रयोग

उदाहरण के लिए, इस कमांड के एग्जिट स्टेटस का उपयोग करते हुए, आप इसका उपयोग केवल अपने इंटरनेट कनेक्शन होने पर ही अपने मोबाइल में कर सकते हैं ~/.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 &

संदर्भ


1

पोंग का मतलब यह नहीं है कि सर्वर पर वेब सेवा चल रही है; इसका मतलब यह है कि सर्वर ICMP प्रतिध्वनि का उत्तर दे रहा है। मैं कर्ल का उपयोग करने और इसके वापसी मूल्य की जांच करने की सलाह दूंगा।


0

यदि आपका लक्ष्य वास्तव में इंटरनेट एक्सेस की जांच करना है , तो इस प्रश्न के कई मौजूदा उत्तर त्रुटिपूर्ण हैं। कुछ बातों से आपको अवगत होना चाहिए:

  1. आपके कंप्यूटर के लिए उस नेटवर्क से कनेक्ट होना संभव है, जिसके पास इंटरनेट एक्सेस नहीं है
  2. यह संभव है कि एक सर्वर पूरे इंटरनेट के बिना नीचे हो सकता है
  3. कैप्टिव पोर्टल के लिए यह संभव है कि यदि आप इंटरनेट का उपयोग नहीं करते हैं तो भी एक मनमाने URL के लिए HTTP प्रतिक्रिया लौटा सकते हैं

इसे ध्यान में रखते हुए, मेरा मानना ​​है कि सबसे अच्छी रणनीति HTTPS कनेक्शन पर कई साइटों से संपर्क करना और उन साइटों में से किसी एक पर प्रतिक्रिया देने पर सही वापस आना है।

उदाहरण के लिए:

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
}

उपयोग:

if connected_to_internet; then
  echo "Connected to internet"
else
  echo "No internet connection"
fi

इस दृष्टिकोण के बारे में कुछ नोट्स:

  1. यह उन सभी झूठी सकारात्मक और नकारात्मक बातों से मजबूत है जिन्हें मैंने ऊपर उल्लिखित किया था
  2. अनुरोध सभी समानांतर गति को अधिकतम करने के लिए होते हैं
  3. यदि आप तकनीकी रूप से इंटरनेट का उपयोग करते हैं तो यह झूठा वापस आ जाएगा लेकिन DNS गैर-कार्यात्मक है या आपकी नेटवर्क सेटिंग्स अन्यथा गड़बड़ है, जो मुझे लगता है कि ज्यादातर मामलों में करना उचित है

कर्ल से रिटर्न कोड का परीक्षण नहीं किया जा रहा है। मेरे सिस्टम पर यदि नेटवर्क उपलब्ध नहीं है तो कर्ल rc = 6 (DNS रिज़ॉल्यूशन में विफल) देता है लेकिन यह कोड "इंटरनेट से कनेक्टेड" रिपोर्ट करता है।
सीपरमैन

@ceperman कर्ल के लिए रिटर्न कोड का परीक्षण उस रेखा पर किया जाता है जहां वह कहता है if wait $pid;। पता नहीं क्यों आपके सिस्टम पर काम नहीं हो रहा है। क्या आप वाकई बैश का उपयोग कर रहे हैं?
Ajedi32

@ इस्पेरमैन एक और संभावना; शायद शीर्ष पर सूची का एक URL वास्तव में करता है , तो आप के लिए बदले सफलता भले ही दूसरों नाम संकल्प असफल रहे हैं?
Ajedi32

2
मेरा बैश काफी बेसिक है इसलिए मैं पढ़ता हूं waitऔर अब समझता हूं कि रिटर्न कोड का वास्तव में परीक्षण किया जा रहा है। मैंने आपके कोड को फिर से कॉपी किया और आज यह काम करता है - व्हाट्स! मैंने पिछली बार कुछ गड़बड़ कर दी होगी, हालांकि मैं यह नहीं समझ सकता कि क्या या कैसे। फिर भी, मैया पुलक। क्षमा याचना।
सीपरमैन


-1

यह यहां पोस्ट किए गए किसी भी समाधान की तुलना में काफी तेज है, और एक विशिष्ट मेजबान का परीक्षण करने के लिए भी इस्तेमाल किया जा सकता है।

चाल आईपी को कम व्यस्त DNS सॉल्वर का उपयोग करके हल कर रही है जो एक नियोजित है 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
}

2
हालांकि यह लिंक प्रश्न का उत्तर दे सकता है, लेकिन उत्तर के आवश्यक भागों को शामिल करना और संदर्भ के लिए लिंक प्रदान करना बेहतर है। लिंक-केवल उत्तर अमान्य हो सकते हैं यदि लिंक किए गए पृष्ठ बदल जाते हैं। - समीक्षा से
डेविड बक

यह इस विशेष स्थिति पर लागू नहीं होता है।
अल्बर्टो साल्विया नॉवेल्ला
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.