2013-08-08 7 views
44

मैं एक स्क्रिप्ट लिखना चाहता हूं, जो नेटवर्क में मौजूद किसी भी डिवाइस की जांच कर रहा है, जो कि पूरे दिन ऑनलाइन होना चाहिए, वास्तव में ऑनलाइन हैं। मैं पिंग उपयोग करने के लिए कोशिश की, लेकिनबैश स्क्रिप्ट्स में पिंग का उपयोग करके होस्ट उपलब्धता की जांच

if [ "`ping -c 1 some_ip_here`" ] 
then 
    echo 1 
else 
    echo 0 
fi 

अगर मैं मान्य है या अमान्य आईपी पता दर्ज 1 कोई बात नहीं देता है। मैं कैसे जांच सकता हूं कि कोई विशिष्ट पता (या आईपी पते की सूची से डिवाइस में से कोई भी बेहतर) ऑफलाइन हो गया है?

+0

आप का उपयोग 'nmap', तो यह आपको IP पता श्रेणी निर्दिष्ट कर सकते हैं पर विचार करना चाहिए

ping -c 1 google.com &> /dev/null && echo success || echo fail 

और इस:

इस तरह

। – devnull

+0

एफडब्ल्यूआईडब्ल्यू, आपका स्निपेट मेरे लिए ठीक काम करता है। –

+0

प्रश्न का उत्तर नहीं है, लेकिन आप "ping -c 1 some_ip_here'" के बजाय "$ (ping -c 1 some_ip_here)" का बेहतर उपयोग करेंगे। [अधिक जानकारी के लिए इस लिंक का संदर्भ लें] (http://stackoverflow.com/a/9449788/1547699) – Anubis

उत्तर

37

पिंग त्रुटि के प्रकार के आधार पर विभिन्न निकास कोड देता है।

ping 256.256.256.256 ; echo $? 
# 68 

ping -c 1 127.0.0.1 ; echo $? 
# 0 

ping -c 1 192.168.1.5 ; echo $? 
# 2 

0 साधन की मेजबानी से पहुंचा जा सकता

2 का मतलब नहीं पहुंचा जा सकता

+0

शांत ... मैं अभी भी स्क्रिप्टिंग के लिए नया हूं और सोचा कि 'अगर मेरे कोड में' अगर बाहर निकलने वाला कोड चेक करता है। .. – burtek

+2

ऐसा करता है, यदि आपका कोई गैर-0 निकास कोड (सभी त्रुटियों) पर 'echo 1' ब्लॉक को ट्रिगर करेगा)। लेकिन यह पता लगाने के लिए कि आप किस प्रकार की त्रुटि थी, आप सटीक निकास कोड की जांच करेंगे। – StianE

+0

क्या आपको पहले '68' मिलता है? मुझे '2' और अनजान मेजबान मिलता है। मुझे गंतव्य होस्ट अप्राप्य के साथ तीसरे उदाहरण पर '1' मिलता है। – nephewtom

38

आप अगर बयान में बैकटिक जरूरत नहीं है। आप इस चेक का उपयोग कर सकते हैं

if ping -c 1 some_ip_here &> /dev/null 
then 
    echo 1 
else 
    echo 0 
fi 

यदि आदेश कमांड (पिंग) के निकास कोड की जांच करता है। अगर निकास कोड शून्य है (जिसका अर्थ है कि आदेश सफलतापूर्वक बाहर निकला है) तो ब्लॉक को निष्पादित किया जाएगा। यदि यह एक गैर-शून्य निकास कोड लौटाता है, तो अन्य ब्लॉक निष्पादित किया जाएगा।

15

पिंग - "फ़िंगिंग" का उन्नत संस्करण है, जो मिलीसेकंड में टाइमआउट को परिभाषित करने की संभावना देता है।

#!/bin/bash 
IP='192.168.1.1' 
fping -c1 -t300 $IP 2>/dev/null 1>/dev/null 
if [ "$?" = 0 ] 
then 
    echo "Host found" 
else 
    echo "Host not found" 
fi 
+0

'पिंग' में एक-विकल्प भी है जो आपको टाइमआउट को परिभाषित करने की अनुमति देता है। –

+6

सच है। लेकिन सेकंड में। 'fping' - मिलीसेकंड में, यदि आपके पास पिंग करने के लिए बहुत सारे होस्ट हैं तो यह महत्वपूर्ण है। –

+0

"यूनिक्स" पिंग '-t' में टाइमआउट के लिए नहीं है, लेकिन टीटीएल के लिए। टाइमआउट को -W के माध्यम से निर्दिष्ट किया गया है। नोट: यह अभी भी लंबे समय तक ब्लॉक कर सकता है, उदाहरण के लिए। अगर DNS सर्वर चला जाता है और एक DNS नाम हल किया जाना है। हाल के हमलों के दिमाग में इस पर विचार किया जाना चाहिए। – dom0

3

FYI करें, मैं बस कुछ परीक्षण से ऊपर है और अगर हम का उपयोग बहु पिंग पद्धति का उपयोग करके (10 अनुरोधों)

पिंग -c10 8.8.8.8 &>/dev/बातिल किया; $ echo?

बहु पिंग कमांड का परिणाम होगा "0" यदि पिंग परिणाम कम से कम एक से पहुंचा जा सकता, और "1" के मामले में जहां सभी पिंग अनुरोध पहुंचा नहीं जा सकता।

7

मैं एक एक लाइनर इस तरह के बारे में सोच सकते हैं

ping -c 1 127.0.0.1 &> /dev/null && echo success || echo fail 

चलाने आईपी या होस्टनाम साथ 127.0.0.1 बदलें, क्या दोनों ही मामलों में किया जाना चाहिए के साथ गूंज आदेशों को बदलने के लिए।

उपरोक्त कोड सफल होगा, शायद आप जानते हैं कि एक आईपी या होस्टनाम के साथ प्रयास करें जो पहुंच योग्य नहीं है।

ping -c 1 lolcatz.ninja &> /dev/null && echo success || echo fail 
1
up=`fping -r 1 $1 ` 
if [ -z "${up}" ]; then 
    printf "Host $1 not responding to ping \n" 
    else 
    printf "Host $1 responding to ping \n" 
fi 
संबंधित मुद्दे