मुझे शेल स्क्रिप्ट में किसी साइट की http स्थिति कैसे (केवल) मिलती है?


13

मुझे लगता है कर्ल काम करेंगे। मैंने एक स्क्रिप्ट में लिखा है:

#!/bin/sh

function test {
    res=`curl -I $1 | grep HTTP/1.1 | awk {'print $2'}`
    if [ $res -ne 200 ]
    then
        echo "Error $res on $1"
    fi
}  

test mysite.com
test google.com

यहाँ समस्या यह है कि मुझे कोई फर्क नहीं पड़ता कि मैं इसे नीचे प्रिंट करने से रोकने के लिए प्राप्त नहीं कर सकता:

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current

मैं इस स्क्रिप्ट को चलाने के लिए एक क्रोनजॉब चाहता हूं और अगर यह इस तरह का संदेश लिखता है तो हर बार जब मैं इसे चलाता हूं तो मुझे एक ईमेल मिलेगा, क्योंकि क्रोन में स्टडआउट करने के लिए कुछ मुद्रित किया गया है, भले ही साइट ठीक हो।

स्टेकआउट में जंक किए बिना मुझे स्थिति कोड कैसे मिलेगा? यह कोड बोनस जंक को छोड़कर स्टडआउट के लिए काम करता है जो मुझे इसका उपयोग करने से रोकता है।

जवाबों:


12
   -s/--silent
          Silent or quiet mode. Don't show progress meter 
          or error messages.  Makes Curl mute.

तो आपका Res जैसा दिखना चाहिए

res=`curl -s -I $1 | grep HTTP/1.1 | awk {'print $2'}`

Error 301 on google.comउदाहरण के लिए, परिणाम है ।


धन्यवाद! इसने मुझे बहुत परेशान किया। (और उन्हें मैन पेज में "प्रगति मीटर" के तहत इसका उल्लेख करना चाहिए)

10

तुम्हें चाहिए

...
res=$( curl -w %{http_code} -s --output /dev/null $1)
...

यह आपको केवल आउटपुट के रूप में HTTP_STATUS कोड देगा।


2

मैं यह सुनिश्चित करने के लिए ऐसा करूँगा कि मैं अंतिम मेजबान पर पुनर्निर्देशित हो जाऊं और उससे प्रतिक्रिया प्राप्त करूँ:

res=($(curl -sLI "${1}" | grep '^HTTP/1' | tail -1))
((res[1] == 200)) || echo ${res[2]}

2

इसे अपनी स्थिति के रूप में उपयोग करें ...

res=`curl -s --head <URL> | head -n 1 | grep -c HTTP/1.1 200 OK`

if [ $res -eq 1 ]
then
MSG = " OKAY"
EXIT_CODE = 0
else
MSG = " NOT OKAY"
EXIT_CODE = 2
fi

1

जैसा कि कर्ल के ऊपर बताया गया है, मूल रूप से http प्रतिक्रिया प्रदान कर सकता है:

#!/bin/bash
#example1.sh
function test {
  RESPONSE=$(curl -so /dev/null -w "%{http_code}\n" ${1})
  if [[ $RESPONSE != 200 ]]; then
    echo "Error ${RESPONSE} on ${1}"
  fi
}    
test mysite.com
test google.com

उदाहरण 1 के साथ -sहम प्रगति को मौन करते हैं और -o /dev/nullहमें प्रतिक्रिया को रद्द कर देते हैं, लेकिन -wयहां आपका सहयोगी है:

$ ./example1.sh 
Error 000 on mysite.com
Error 301 on google.com

इसे url_effective और redirect_url के लिए पूछकर कर्ल में देशी रूप से और सरल बनाया जा सकता है:

#!/bin/bash
#example2.sh
function test {
  curl -so /dev/null -w "%{http_code}\t%{url_effective}\t%{redirect_url}\n" ${1}
}  
test mysite.com
test google.com

उदाहरण 2 हम अपनी आरंभिक http प्रतिक्रिया, मूल अनुरोधित डोमेन देखते हैं, और सर्वर को उसके साथ प्रतिसाद देते हैं:

$ ./example2.sh 
000 HTTP://mysite.com/  
301 HTTP://google.com/  http://www.google.com/

हालाँकि यदि आप अंततः 301 या 302 पुनर्निर्देशित होने के बाद भी 200 प्रतिसाद स्थापित करना चाहते हैं: तो आप उपर्युक्त 'पुनर्निर्देशन' को छोड़ सकते हैं और छोड़ सकते हैं।

#!/bin/bash
#example3.sh
function test {
  curl -sLo /dev/null -w "%{http_code}\t%{url_effective}\n" ${1}
}  
test mysite.com
test google.com

उदाहरण 3 हम जोड़ते हैं -Lजो कर्ल को पुनर्निर्देशन का पीछा करने का निर्देश देता है:

$ ./example3.sh 
000 HTTP://mysite.com/
200 http://www.google.com/

U & L में आपका स्वागत है। आपका पहला वाक्य "जैसा कि ऊपर बताया गया है" बताता है कि आपके उत्तर की स्थिति भ्रामक है क्योंकि यह वोट और उपयोगकर्ता सेटिंग्स पर निर्भर करता है। कुछ लाइन का उपयोग करना बेहतर है "जैसा कि @some_user ने ऊपर बताया है" ( some_userवास्तविक नाम होने के साथ ) या "जैसा कि दूसरों ने बताया है"
एंथन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.