जब ब्राउज़र करेगा तो इस लिंक को कर्ल क्यों नहीं करेगा?


30

मैं Mac OS 10.11.6 El Capitan चला रहा हूं। एक लिंक है जिसे मैं प्रोग्राम डाउनलोड करना चाहूंगा:

https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.16-osx10.11-x86_64.dmg

यदि मैं इस URL को किसी भी ब्राउज़र (जैसे सफ़ारी) में पेस्ट करता हूँ तो डाउनलोड पूरी तरह से काम करता है।

हालाँकि, यदि मैं कमांड लाइन से उसी URL को डाउनलोड करने का प्रयास करता हूं, तो curlयह काम नहीं करता है - परिणाम एक खाली फाइल है:

$ ls -lA
$ curl -O https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.16-osx10.11-x86_64.dmg
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
$ ls -lA
total 0
-rw-r--r--  1 myname  staff  0 Nov  7 14:07 mysql-5.7.16-osx10.11-x86_64.dmg
$ 

बेशक मैं ब्राउज़र के माध्यम से फाइल प्राप्त कर सकता हूं, लेकिन मैं यह समझना चाहूंगा किcurl ऊपर का कमांड क्यों काम नहीं करता है।

curlइस फ़ाइल को सही ढंग से डाउनलोड क्यों नहीं किया जा सकता है, जब यह स्पष्ट रूप से वेबसाइट पर मौजूद है और इसे ग्राफिकल वेब ब्राउज़र के माध्यम से सही तरीके से एक्सेस और डाउनलोड किया जा सकता है?


7
मैं यह बताना चाहता हूं कि भले ही रीडायरेक्ट पर टेक्र्राफ का जवाब पूरी तरह से सही हो, लेकिन हेडर जैसे अन्य कारक किसी सर्वर को फ़ाइल डाउनलोड करने के लिए कर्ल क्लाइंट के अनुरोध को अस्वीकार करने का कारण बन सकते हैं। उदाहरण के लिए, यदि सर्वर में DDoS सुरक्षा है, तो ऐसा सुरक्षा सॉफ़्टवेयर आमतौर पर व्यवहार्य ब्राउज़र हेडर के लिए जाँच करता है, जैसे कि एक उचित होना User-Agent। इसके अतिरिक्त, कुछ ब्राउज़र डाउनलोड सत्र कुकीज के कारण सफल हो सकते हैं (अर्थात यदि आप लॉग इन हैं) केवल उक्त ब्राउज़र पर मौजूद है।
जोसेफ ए।

6
एक कर्ल कमांड का निवारण करने के लिए, आप curl -v"वर्बोज़" के लिए उपयोग कर सकते हैं । यह कनेक्शन, अनुरोध और प्रतिक्रिया के बारे में विभिन्न जानकारी को मानक त्रुटि पर प्रिंट करेगा। इस स्थिति में, आप देखेंगे कि प्रतिक्रिया में HTTP 302 Found(एक रीडायरेक्ट कोड) और LocationURL पर जाने के लिए एक हेडर शामिल है। फिर आप यह man curlपता लगा सकते हैं कि इसे रीडायरेक्ट का पालन करने का तरीका कैसे बताया जाए।
नाथन लॉन्ग

जवाबों:


59

निम्नलिखित URL के लिए वेबसर्वर-साइड पर एक रीडायरेक्ट है http://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.16-osx10.11-x86_64.dmg:। क्योंकि यह एक CDN है, सटीक व्यवहार (चाहे आप पुनर्निर्देशित हो या नहीं) आपके स्थान पर निर्भर हो सकता है।

curlडिफ़ॉल्ट रूप से पुनर्निर्देश नहीं करता है। ऐसा करने के लिए कहने के लिए, -Lतर्क जोड़ें :

curl -L -O https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.16-osx10.11-x86_64.dmg

6
एक HTTPS-to-HTTP रीडायरेक्ट? यह भयानक है, और मुझे आश्चर्य नहीं है कि कर्ल इसे अच्छी तरह से अकेला छोड़ देता है ...
टोबी स्पाइट नाइट

और अगर यह इसे हल नहीं करता है? कुछ .asp सामान के साथ क्या करना है?
मैथमेटिक्स

4

यदि ब्राउज़र फ़ाइल को डाउनलोड करने में सक्षम है, तो आप निरीक्षण कर सकते हैं कि ब्राउज़र क्या कर रहा है। Google क्रोम पर आप निम्न का उपयोग करके देख सकते हैं कि क्या हो रहा है।

1) [देखें> डेवलपर> डेवलपर टूल> नेटवर्क टैब> हेडर टैब]

2) डाउनलोड लिंक पर क्लिक करें।

3) फ़ाइल लिंक डेवलपर टूल टैब पर दिखाई देगा।

4) फाइल पर राइट क्लिक करें और कॉपी करें> कॉपी करें cURL के रूप में।

अब आपके पास एक कर्ल लिंक है जो काम करेगा। संभवत: इसके अतिरिक्त पैरामीटर होंगे जिन्हें आप ट्रिम-दूर कर सकते हैं।

अधिक जानकारी: https://lornajane.net/posts/2013/chrome-feature-copy-as-curl


0

मैं इस पोस्ट की टिप्पणियों में से एक को उत्तर में बदलने जा रहा हूं।

कई HTTP / HTTPS लिंक हैं जिन्हें काम करने के लिए कुछ हेडर की आवश्यकता होती है। तो यह एक वेब ब्राउज़र से काम करने की प्रतिक्रिया के परिणामस्वरूप होगा, लेकिन कर्ल जैसे बैकएंड वेब अनुरोध में काम करने की प्रतिक्रिया नहीं।

मैं बस एक साइट में भाग गया जिसमें सभी निम्नलिखित हेडर की आवश्यकता थी। उन्हें निर्दिष्ट करने में विफलता एक परिणाम के रूप में हुई।

  httpget.setHeader("User-Agent", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36");
  httpget.setHeader("Upgrade-Insecure-Requests", "1");
  httpget.setHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8");
  httpget.setHeader("Accept-Encoding", "gzip, deflate, br");
  httpget.setHeader("Accept-Language", "en-US,en;q=0.9");
  httpget.setHeader("Connection", "keep-alive");
  httpget.setHeader("Host", "www.thehost.com");
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.