यूआरएल की सूची का HTTP स्टेटस कोड प्राप्त करने के लिए स्क्रिप्ट?


87

मेरे पास URLS की एक सूची है जिसे मुझे जांचने की आवश्यकता है, यह देखने के लिए कि वे अभी भी काम करते हैं या नहीं। मैं एक बैश स्क्रिप्ट लिखना चाहूंगा जो मेरे लिए हो।

मुझे केवल दिए गए HTTP स्टेटस कोड की आवश्यकता है, यानी 200, 404, 500 और उसके बाद। और कुछ नहीं।

EDIT ध्यान दें कि एक समस्या है यदि पृष्ठ "404 नहीं मिला" कहता है, लेकिन एक 200 ओके संदेश लौटाता है। यह एक गलत वेब सर्वर है, लेकिन आपको इस मामले पर विचार करना पड़ सकता है।

इस पर अधिक जानकारी के लिए, देखें कि क्या कोई URL "404" टेक्स्ट वाले पृष्ठ पर जाता है


2
निष्पक्ष होने के लिए, मेरी स्क्रिप्ट का "बग" तभी है जब सर्वर HTTP कोड 200 लौटाता है लेकिन बॉडी टेक्स्ट "404 नहीं मिला" कहता है, जो एक दुर्व्यवहार करने वाला वेबसर्वर है।
फिल

2
छूट की स्थिति 0 होगी यदि प्रतिक्रिया कोड 200 था, 8 यदि 404, 4 यदि 302 ... आप $ का उपयोग कर सकते हैं? पिछले कमांड के एग्जिट स्टेटस तक पहुंचने के लिए वेरिएबल।
केसी वाटसन

जवाबों:


194

इसके लिए कर्ल का एक विशिष्ट विकल्प है --write-out:

$ curl -o /dev/null --silent --head --write-out '%{http_code}\n' <url>
200
  • -o /dev/null सामान्य आउटपुट को निकाल फेंकता है
  • --silent प्रगति मीटर को दूर फेंकता है
  • --head GET के बजाय HEAD HTTP अनुरोध करता है
  • --write-out '%{http_code}\n' आवश्यक स्थिति कोड प्रिंट करता है

इसे पूरी बैश स्क्रिप्ट में लपेटने के लिए:

#!/bin/bash
while read LINE; do
  curl -o /dev/null --silent --head --write-out "%{http_code} $LINE\n" "$LINE"
done < url-list.txt

(ईगल-आईडेड रीडर्स ध्यान देंगे कि यह प्रति यूआरएल एक कर्ल प्रोसेस का उपयोग करता है, जो कांटा और टीसीपी कनेक्शन पेनल्टी लगाता है। यह बहुत तेजी से होगा यदि एक ही कर्ल में कई यूआरएल को जोड़ दिया गया, लेकिन राक्षस पुनरावृत्ति को लिखने के लिए जगह नहीं है। कर्ल करने के लिए विकल्प के विकल्प।


बहुत अच्छा। क्या मैं अपनी फ़ाइल में प्रत्येक url पर उस कमांड को निष्पादित कर सकता हूं?
मनु

1
@ मनु: हां, मैंने कर्ल कमांड को लपेटने के एक संभावित तरीके को दिखाने के लिए अपना जवाब संपादित किया है। यह मानता है कि url-list.txt में प्रति पंक्ति एक URL है।
फिल

1
मुझे नहीं पता कि ऊपर से लिपि क्यों और मुझे हमेशा आउटपुट में 000 मिलती है, लेकिन जब मैं केवल एक बार लूप के बिना कमांड चलाता हूं तो यह काम करता है ...
करोल एफ

1
@KarolFiturski मुझे वही समस्या थी (जो आपने शायद तय की है, लेकिन इस मामले में किसी और ने ठोकर खाई है ...) मेरे मामले में मैंने अपनी इनपुट फ़ाइल के लाइन छोर पर कैरिज रिटर्न किया था, जिससे यूआरएल पसंद आया http://example.com/\rजब लूप के माध्यम से जा रहा है
जॉर्डन रॉबिन्सन

1
मेरे पास यह समस्या थी और मैं इसे विंडोज प्रकार से लिनक्स प्रकार पर समाप्त होने वाली लाइन को स्विच करके ठीक करने में सक्षम था।
ट्रिस्टन

38
wget --spider -S "http://url/to/be/checked" 2>&1 | grep "HTTP/" | awk '{print $2}'

आपके लिए केवल स्टेटस कोड प्रिंट करता है


9
+1 जब एक नई पंक्ति में एक url पुनर्निर्देशित किया जाता है, तो कई कोड दिखाता है।
आश्फेम

इसके लिए --spider से छुटकारा पाना था उस अनुरोध के साथ काम करने के लिए जिसे मैं बनाने की कोशिश कर रहा था, लेकिन काम करता है।
amitavk

30

फिल द्वारा पहले से उपलब्ध कराए गए उत्तर का विस्तार। यदि आप कॉल के लिए xargs का उपयोग करते हैं, तो इसे समानांतर रूप से जोड़ना bash में कोई ब्रेनर नहीं है।

यहाँ कोड है:

xargs -n1 -P 10 curl -o /dev/null --silent --head --write-out '%{url_effective}: %{http_code}\n' < url.lst

-n1 : कर्ल कॉल के तर्क के रूप में (सूची से) सिर्फ एक मूल्य का उपयोग करें

-10 : किसी भी समय 10 कर्ल प्रक्रियाओं को जीवित रखें (यानी 10 समानांतर कनेक्शन)

write_outअधिक डेटा के लिए कर्ल के मैनुअल में पैरामीटर की जांच करें जिसे आप इसका उपयोग करके निकाल सकते हैं (समय, आदि)।

मामले में यह किसी को मदद करता है यह वह कॉल है जो मैं वर्तमान में उपयोग कर रहा हूं:

xargs -n1 -P 10 curl -o /dev/null --silent --head --write-out '%{url_effective};%{http_code};%{time_total};%{time_namelookup};%{time_connect};%{size_download};%{speed_download}\n' < url.lst | tee results.csv

यह सिर्फ csv फ़ाइल में डेटा का एक गुच्छा आउटपुट करता है जिसे किसी भी कार्यालय उपकरण में आयात किया जा सकता है।


2
समानांतरवाद, फ़ाइल इनपुट और सीएसवी। ठीक वही जो मेरे द्वारा खोजा जा रहा था।
उम्र

शानदार, मेरा दिन बना।
xlttj

यह कमाल है, बस मैं जो चाह रहा था, धन्यवाद सर। एक प्रश्न, सीएसवी परिणामों में कोई पृष्ठ के पृष्ठ शीर्षक को कैसे शामिल कर सकता है?
मिशेल

@estani - stackoverflow.com/users/1182464/estani किसी व्यक्ति को पृष्ठ की पृष्ठ शीर्षक को .csv फ़ाइल में कैसे शामिल किया जा सकता है। रेपोस्ट के लिए क्षमा करें, आपको टैग करना भूल गया ताकि आपको इस प्रश्न के बारे में सूचित किया जा सके। बहुत धन्यवाद।
मिशेल

@MitchellK यह http कॉल की सामग्री को बिल्कुल भी नहीं संभाल रहा है। यदि "पृष्ठ शीर्षक" (जो कुछ भी है) यूआरएल में है, तो आप इसे जोड़ सकते हैं। यदि नहीं, तो आपको "शीर्षक" निकालने के लिए पूरे पृष्ठ को पार्स करने की आवश्यकता है (यह मानते हुए कि एचटीएमएल पेज http द्वारा पुनर्प्राप्त किया गया है)। स्टैक ओवरफ्लो पर अन्य उत्तरों की तलाश करें या उस विशिष्ट प्रश्न को पूछें।
एस्टानी जूल

15

यह व्यापक रूप से उपलब्ध पर निर्भर करता है wget, लगभग हर जगह मौजूद है, यहां तक ​​कि अल्पाइन लिनक्स पर भी।

wget --server-response --spider --quiet "${url}" 2>&1 | awk 'NR==1{print $2}'

स्पष्टीकरण इस प्रकार हैं:

--quiet

Wget का आउटपुट बंद करें।

स्रोत - wget मैन पेज

--spider

[...] यह पृष्ठों को डाउनलोड नहीं करेगा, बस जांच लें कि वे वहां हैं। [...]

स्रोत - wget मैन पेज

--server-response

HTTP सर्वर द्वारा भेजे गए हेडर और FTP सर्वर द्वारा भेजे गए प्रतिक्रियाओं को प्रिंट करें।

स्रोत - wget मैन पेज

वे जो नहीं कहते हैं, --server-responseवह यह है कि उन हेडर आउटपुट को मानक त्रुटि (sterr) पर प्रिंट किया जाता है , इस प्रकार स्टड को रीडायरेक्ट करने की आवश्यकता होती है ।

आउटपुट को मानक इनपुट पर भेजा जाता है, हम इसे awkHTTP स्थिति कोड निकालने के लिए पाइप कर सकते हैं । वह कोड है:

  • दूसरा ( $2) वर्णों का गैर-रिक्त समूह:{$2}
  • शीर्ष लेख की पहली पंक्ति पर: NR==1

और क्योंकि हम इसे प्रिंट करना चाहते हैं ... {print $2}

wget --server-response --spider --quiet "${url}" 2>&1 | awk 'NR==1{print $2}'

1
मैंने इसके साथ एक प्रयोग किया2>&1 | head -1 | awk '{ print $2 }'
इव्हज

7

curlHTTP- हैडर को केवल (संपूर्ण फ़ाइल नहीं) लाने के लिए उपयोग करें और इसे पार्स करें:

$ curl -I  --stderr /dev/null http://www.google.co.uk/index.html | head -1 | cut -d' ' -f2
200

कर्ल ने मुझे 200 बताया जब wget 404 कहता है ... :(
मनु

-Iध्वज का कारण बनता है एक HTTP HEAD अनुरोध है, जो कुछ सर्वर द्वारा एक सामान्य HTTP GET से अलग व्यवहार किया जाता है और इस प्रकार विभिन्न मूल्यों लौट सकते हैं बनाने के लिए कर्ल। कमांड को इसके बिना भी काम करना चाहिए।
लाम्बासांक्सी

4

wget -S -i *file* आप एक फ़ाइल में प्रत्येक यूआरएल से हेडर मिल जाएगा।

grepविशेष रूप से स्थिति कोड के लिए फ़िल्टर करें ।


1

मुझे पायथन में लिखा एक टूल "वेबचैक" मिला, जो यूआरएल की सूची के लिए एक स्थिति कोड देता है। https://pypi.org/project/webchk/

आउटपुट इस तरह दिखता है:

▶ webchk -i ./dxieu.txt | grep '200'
http://salesforce-case-status.dxi.eu/login ... 200 OK (0.108)
https://support.dxi.eu/hc/en-gb ... 200 OK (0.389)
https://support.dxi.eu/hc/en-gb ... 200 OK (0.401)

उम्मीद है की वो मदद करदे!


0

Https://mywiki.wooledge.org/BashPitashes#Non-atomic_writes_with_xargs_-P ( xargsमिश्रित नौकरियों में समानांतर नौकरियों से उत्पादन होने के कारण ), मैं GNU समानांतर का उपयोग समानांतर करने के बजाय करूंगा xargs:

cat url.lst |
  parallel -P0 -q curl -o /dev/null --silent --head --write-out '%{url_effective}: %{http_code}\n' > outfile

इस विशेष मामले में यह उपयोग करने के लिए सुरक्षित हो सकता है xargsक्योंकि आउटपुट बहुत कम है, इसलिए उपयोग करने के साथ समस्या xargsयह है कि यदि कोई बाद में कुछ बड़ा करने के लिए कोड को बदलता है, तो यह अब सुरक्षित नहीं होगा। या अगर कोई इस प्रश्न को पढ़ता है और सोचता है कि वह curlकिसी और चीज़ से बदल सकता है, तो वह भी सुरक्षित नहीं हो सकता है।

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