अगर मैं HTTP स्थिति कोड 200 नहीं है, तो क्या मैं 0 से भिन्न एक्ज़िटकोड के साथ CURL को विफल कर सकता हूँ?


237

मैं हमेशा यह मान रहा था कि जब कर्ल को HTTP 500 प्रतिसाद मिला था, तो यह एक एग्जिट कोड लौटा रहा था जिसका मतलब था कि विफलता (! 0), लेकिन ऐसा लगता है कि मामला नहीं है।

अगर मैं HTTP स्थिति कोड 200 नहीं है, तो क्या कोई ऐसा तरीका है जिसे मैं 0 से भिन्न एक्ज़िटकोड के साथ कर सकता हूँ? मुझे पता है कि मैं इसका उपयोग कर सकता हूं, -w "%{http_code}"लेकिन इसे एसटीडीयूएस में रखता हूं, निकास कोड के रूप में नहीं (इसके अलावा, मैं आउटपुट को कैप्चर करने में भी दिलचस्पी रखता हूं, जिसे मैं किसी फ़ाइल पर रीडायरेक्ट नहीं करना चाहता, लेकिन स्क्रीन पर)।

जवाबों:


262

curl --fail क्या आप चाहते हैं का हिस्सा है:

से man curl:

-f, --fail

(HTTP) सर्वर त्रुटियों पर चुपचाप (सभी में कोई आउटपुट नहीं) विफल। यह ज्यादातर असफल प्रयासों से बेहतर तरीके से स्क्रिप्ट आदि को सक्षम करने के लिए किया जाता है। सामान्य मामलों में जब एक HTTP सर्वर एक दस्तावेज़ देने में विफल रहता है, तो यह एक HTML दस्तावेज़ को बताते हुए लौटाता है (जो अक्सर यह भी बताता है कि क्यों और अधिक)। यह ध्वज कर्ल को आउटपुट करने से रोकता है और त्रुटि 22 को लौटाता है।

यह विधि विफल-सुरक्षित नहीं है और ऐसे अवसर हैं जहां गैर-सफल प्रतिक्रिया कोड के माध्यम से फिसल जाएगा, खासकर जब प्रमाणीकरण शामिल होता है (प्रतिक्रिया कोड 401 और 407)।

लेकिन यह आउटपुट को स्क्रीन पर ब्लॉक कर देता है।


2
तो इसके कौन से हिस्से ऐसा करते हैं और क्या नहीं?
रॉगरडपैक

5
@rogerdpack tl; ड्रोन इसे नॉनज़रो लौटाता है जब यह एक खराब प्रतिक्रिया का पता लगाता है, लेकिन यह ओपी को प्रतिक्रिया पर कब्जा नहीं करने देगा
रैंप

3
यह HTTP 301 मूव को स्थायी रूप से नहीं पकड़ता है। कर्ल ने फिर भी एग्जिट कोड 0.
वाइजबकि

4
@wisbucky 301 एक त्रुटि नहीं है, यह एक पुनर्निर्देशन स्थिति कोड है। त्रुटियां 4xx और 5xx स्थिति कोड हैं।
एम। जस्टिन

1
HTTP त्रुटि कोड पर नॉनज़रो से बाहर निकलने के लिए @wisbucky और HTTP रीडायरेक्ट को सही तरीके से हैंडल करने के लिए curl -f -Lऔर इस प्रश्न को विवरण के लिए देखें कि क्या -Lकरता है।
नूह सूसन

81

यदि आप कर्ल किए गए पृष्ठ की सामग्री को प्रदर्शित करना चाहते हैं, तो आप ऐसा कर सकते हैं:

STATUSCODE=$(curl --silent --output /dev/stderr --write-out "%{http_code}" URL)

if test $STATUSCODE -ne 200; then
    # error handling
fi

यह पेज का कंटेंट STDER को HTTP स्टेटस कोड लिखते समय STDERR को लिखता है, इसलिए इसे वेरिएबल STATUSCODE को सौंपा जा सकता है ।


3
कैसे के बारे में अगर मैं विफलता (200) पर प्रतिक्रिया का उत्पादन करना चाहता हूं , लेकिन 0स्क्रिप्ट से एक गैर स्थिति कोड लौटाता है ?
जस्टिन

2
@ जस्टिन: किस बारे में if [ "$statuscode" -ne 200 ]; then exit "$statuscode"; fi?
घटि

4
@ghoti: केवल अहस्ताक्षरित 8-बिट एक्ज़िट कोड का समर्थन किया जाता है, ताकि थोड़ा भ्रमित हो सके।
डेनिस

3
आह, ठीक है - और कोड 8 बिट पर लपेटेंगे, इसलिए त्रुटि 404 निकास मूल्य 148 हो जाती है, 500 244 हो जाती है। वास्तव में भ्रमित करना! :-)
गोटी

7
थोड़ी भिन्नता के रूप में, यह stdout की प्रतिक्रिया को पुनर्निर्देशित करते हुए एक चर में कोड को कैप्चर करता है, न कि stderr: { code=$(curl ... as above ...); } 2>&1चाल वह { ... } 2>&1है जो पुनर्निर्देशन की अनुमति देता है, जबकि एक अलग शेल को नहीं खोलना ( ... )होगा।
तोबिया

31

मैं झंडे के संयोजन का उपयोग करने में सक्षम था:

curl --silent --show-error --fail URL

--silent प्रगति और त्रुटि को छुपाता है
--show-त्रुटि से छिपा त्रुटि संदेश से पता चलता --silent
--fail एक निकास कोड> 0 लौटाता है जब अनुरोध विफल रहता है


5
यह सर्वर उत्तर नहीं दिखाता है। मैं ओपी नहीं हूं, लेकिन मुझे संदेह है कि वह सर्वर से किसी भी त्रुटि संदेश को देखना चाहता था जो शरीर में वापस आ गया है। एक --silent --show-error --failकाम के अलावा बस के रूप में एक ही -f/--fail
बेकार

1
वास्तव में, --failबाहर निकलने के कोड लौटाता है 22, के रूप में दस्तावेज
Quolonel प्रश्न

2
@wisbucky 301 एक त्रुटि नहीं है, यह एक पुनर्निर्देशन स्थिति कोड है। त्रुटियां 4xx और 5xx स्थिति कोड हैं।
एम। जस्टिन

4
@Wisbucky के निष्पक्ष होने के लिए, मूल प्रश्न "[...] है यदि HTTP स्थिति कोड 200 नहीं है" । पहले कहीं भी "त्रुटि" का उल्लेख नहीं है।
केन

2
@ M.Justin कर्ल मैन-पेज के अनुसार: यह विधि विफल-सुरक्षित नहीं है और ऐसे मौके हैं जहां गैर-सफल प्रतिक्रिया कोड के माध्यम से फिसल जाएगा, खासकर जब प्रमाणीकरण शामिल होता है (प्रतिक्रिया कोड 401 और 407)।
Youfu

0

हां ऐसा करने का एक तरीका है, लेकिन यह स्पष्ट नहीं है क्योंकि इसमें 3 कर्ल विकल्प शामिल हैं:

curl -s --fail --show-error https://httpbin.org/status/200 > /dev/null
curl -s --fail --show-error https://httpbin.org/status/401 > /dev/null
curl -s --fail --show-error https://httpbin.org/status/404 > /dev/null
curl -s --fail --show-error https://bleah-some-wrong-host > /dev/null

यह विश्वास दिलाता है कि सफलता (0) तभी होती है जब कर्ल अंतिम 2xxरिटर्न कोड के साथ समाप्त stdoutहो जाता है और जो शरीर को प्राप्त होता है और जो किसी भी त्रुटि को stderr को प्रदर्शित किया जाएगा।

कृपया ध्यान दें कि कर्ल प्रलेखन आपको थोड़ा भ्रमित कर सकता है क्योंकि यह उल्लेख करता है कि - कुछ 401 कोड के लिए सफल हो सकता है। उन परीक्षणों के आधार पर, जो सही नहीं हैं, कम से कम जब एक ही समय में --show- त्रुटि के साथ उपयोग किया जाता है।

अब तक मुझे ऐसा कोई भी मामला नहीं मिला था, जहां कर्ल सफलता लौटाए जब यह इन विकल्पों के साथ http-succeds नहीं था।


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