पिंग या समान कमांड का उपयोग करके इंटरनेट पर किसी फ़ाइल का पता कैसे लगाएं?


10

मेरे पास इंटरनेट पर अपना कुछ सामान डाउनलोड करने के लिए एक शेल स्क्रिप्ट है। मुझे कैसे पता चलेगा कि इंटरनेट पर कोई फ़ाइल मौजूद है? मान लीजिए कि मैं जानना चाहता हूं कि http://192.168.1.1/backup/01012011.zipमौजूद है या नहीं? मेरे पास pingकमांड का उपयोग करने की कोशिश है , लेकिन यह त्रुटि दिखाता है, मुझे लगता है कि यह /चरित्र है।

क्या कोई मेरी मदद कर सकता है? क्या कोई और तरीका है?


यह ध्यान दिया जाना चाहिए कि pingHTTP अनुरोधों को बिल्कुल नहीं भेजता है। बल्कि, pingएक प्रोटोकॉल का उपयोग करता है जिसे 'ICMP' कहा जाता है, यह निर्धारित करने के लिए कि क्या एक मेजबान उपलब्ध है और विलंबता की जांच करता है।
नाथन उस्मान

जवाबों:


8

निश्चित रूप से एक और तरीका है - लेकिन यह समझने की आवश्यकता है कि इंटरनेट पर अनुरोध किए जाने पर वास्तव में क्या होता है। जब आप अपने वेब ब्राउज़र में किसी पृष्ठ पर जाते हैं, तो HTTP (हाँ, यही कारण है कि आप अक्सर http://URL की शुरुआत में देखेंगे ) नामक प्रोटोकॉल का उपयोग करके डेटा स्थानांतरित किया जाता है ।

HTTP एक टेक्स्ट-आधारित प्रोटोकॉल है। अनुरोध के मुख्य भाग द्वारा हेडर भेजकर ग्राहक और सर्वर के बीच सूचना का आदान-प्रदान किया जाता है। शीर्षलेखों में अनुरोध और स्थानांतरित की जा रही जानकारी के बारे में बहुत अधिक जानकारी है। जिस शीर्ष लेख में आपको अपनी समस्या में मदद करने में रुचि होगी वह वास्तव में शीर्ष लेख नहीं है - यह बहुत पहली पंक्ति में स्थानांतरित किया गया है और इसमें एक नंबर है जिसे स्थिति कोड कहा जाता है। यह संख्या 3 अंक है और स्थिति की जानकारी बताती है। यदि कोई अनुरोध सफल था, तो परिणाम आमतौर पर 200 होता है (हमेशा नहीं - अपवाद हैं)।

एक बात सुनिश्चित करने के लिए है - यदि आपके द्वारा अनुरोधित फ़ाइल वेब सर्वर पर मौजूद नहीं है, तो सर्वर को 404 की स्थिति कोड के साथ उत्तर देना चाहिए। यह इंगित करता है कि संसाधन नहीं मिला। (जिज्ञासु के लिए, यहां HTTP स्टेटस कोड और उनके अर्थ की सूची दी गई है।)

अच्छा, पर्याप्त सिद्धांत। आइए देखें कि हम टर्मिनल पर यह कैसे कर सकते हैं। HTTP का उपयोग करके अनुरोध प्राप्त करने के लिए एक महान उपकरण जो हमें स्टेटस कोड की जांच करने की क्षमता भी प्रदान करता है, वह है CURL, जो उबंटू रिपॉज में उपलब्ध है। आप इसे स्थापित कर सकते हैं:

sudo apt-get install curl

एक बार जब आप इसे स्थापित कर लेते हैं, तो आप इसे इस तरह से लागू कर सकते हैं:

curl [website]

... और दिए गए URL की सामग्री को टर्मिनल पर प्रिंट किया जाएगा। यह वह जानकारी है जो आपका वेब ब्राउज़र देखता है जब वह उस URL पर जाता है। यह हमें कैसे मदद करता है? खैर, कमान के लिए झंडेcurl पर एक करीब से नज़र डालें । यदि हम पैरामीटर पास करते हैं --head, तो cURL अनुरोध से केवल हेडर वापस करेगा । इसे एक URL के साथ आज़माएँ। आपको फॉर्म की लाइनों की एक सूची मिलेगी:

header-name: header-value

ध्यान दें, निश्चित रूप से, पहली पंक्ति बहुत कुछ नहीं दिखती है। उस स्थिति कोड को याद रखें जिसके बारे में हमने पहले बात की थी? आप इसे तीन-अंकीय संख्या के रूप में पहली पंक्ति में देखेंगे। अब हमें पर्ल के उपयोग से पहली पंक्ति से इसे निकालने की आवश्यकता है - और हम इसे पर्ल के -eझंडे का उपयोग करके टर्मिनल में कर सकते हैं, जो हमें पर्ल कोड को सीधे पर्ल इंटरप्रिटर के पास भेजते हैं। हमें CURL ( --silent) के लिए एक अतिरिक्त ध्वज जोड़ने की आवश्यकता होगी ताकि इसे एक प्रगति पट्टी प्रदर्शित करने और हमारी पेरो लिपि को गड़बड़ाने से बचाया जा सके।

यहाँ हम क्या जरूरत है ... यह शेल से बहुत से बचने की आवश्यकता के कारण काफी जटिल है:

perl -e "\ $ s = \ 'कर्ल [URL] --head --silent \`; \ $ s = ~ m / (\\ d {3}) /; प्रिंट \ $ 1 "

यह जो मूल रूप से कर रहा है वह URL को cURL के साथ ला रहा है और इसे एक पर्ल रेगुलर एक्सप्रेशन के माध्यम से चला रहा है जो स्टेटस कोड निकालता है और इसे प्रिंट करता है।

अब आपको केवल उस फ़ाइल के URL में डालना होगा जिसे आप चेक कर रहे हैं और उसकी तुलना '404' से कर रहे हैं। यदि आपको '404' मिलता है, तो आप मान सकते हैं कि फ़ाइल मौजूद नहीं है।

बेशक, टर्मिनल में हेरफेर करना बहुत मुश्किल हो सकता है, इसलिए आप एक छोटी स्क्रिप्ट लिख सकते हैं जो न केवल समझने में आसान बनाता है, बल्कि निष्पादित करने में भी आसान है:

#!/usr/bin/perl

# Get the URL
$url = $ARGV[0];

# Fetch the header
$header = `curl $url --head --silent`;

# Try to find the status code
$header =~ m/(\d{3})/;

# Return the result
exit(0) if $1 == 404;
exit(1);

बस एक फाइल में कॉपी और पेस्ट करें। इस उदाहरण के लिए, मैं फ़ाइल को कॉल करूँगा url_check। फिर फ़ाइल को निष्पादन योग्य बनाएं:

chmod 755 url_check

फिर आप निम्नलिखित सरल कमांड के साथ किसी भी फ़ाइल की जांच कर सकते हैं:

./url_check [URL]

यदि सर्वर 404 और '1' अन्यथा लौटाता है तो रिटर्न वैल्यू '0' होगी। फिर आप इस कमांड को शेल में वैसे ही चेन कर सकते हैं जैसे आप किसी और कमांड में करते हैं।


सिद्धांत और समाधान के बारे में बहुत बहुत धन्यवाद, ... लेकिन पर्ल भाग, .. मुझे लगता है कि यह सिर्फ एक साधारण शेल स्क्रिप्ट के साथ बनाने के लिए आश्चर्य है, .. काम करने पर, ....
ईगी मोहम्मद एरदीन

@Warung: खैर ... एक शेल स्क्रिप्ट को एक बाहरी URL को न केवल क्वेरी करने के लिए एक बाहरी कमांड को कॉल करना होगा, बल्कि प्रतिक्रिया को पार्स करने के लिए भी।
नाथन उस्मान

yups ... और mybe मैं cutआदेशों के साथ प्रतिक्रिया पार्स करने की कोशिश कर सकते हैं ... लेकिन अभी भी काम नहीं करते, .. अभी के लिए, मैं इसे सिर्फ वही करता हूं जो आपने किया था ..
Egy Mohammad Erdin

@ WarungNasi49: कुछ पसंद है curl $url --head --silent | head -n 1 | cut -d ' ' -f 2?
zpea

@GeorgeEdison: अच्छा जवाब! जैसा कि आपने bash से perl कोड को उद्धृत करते हुए उल्लेख किया है: यदि आप अपने perl अभिव्यक्ति के चारों ओर 'दोहरे उद्धरणों ( ") के बजाय सिंगल कोट्स ( ) में बहुत सारे बैकस्लैश से छुटकारा पा सकते हैं ।
zpea

13

आप --spiderwget के विकल्प का उपयोग कर सकते हैं , जो वास्तव में फ़ाइल को डाउनलोड नहीं करता है, लेकिन अगर वहाँ है तो बस जाँच करता है। आपके उदाहरण में:

wget --spider http://192.168.1.1/backup/01012011.zip

200 OKयदि फ़ाइल नहीं है या त्रुटि है, जैसे 404 Not Foundकि यह नहीं है, या 403 Forbiddenयदि आपको इसे प्राप्त करने की अनुमति नहीं है , तो यह एक संदेश लौटाएगा ।


1
wget http://192.168.1.1/backup/01012011.zip

परिणाम कोड 0 का अर्थ है हां, कुछ और - नहीं।

आप $?चर के साथ स्क्रिप्ट के अंदर परिणाम कोड की जांच कर सकते हैं ।


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