Ich verwende Mac OS 10.11.6 El Capitan. Es gibt einen Link, den ich programmgesteuert herunterladen möchte:
https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.16-osx10.11-x86_64.dmg
Wenn ich diese URL in einen Browser (zB Safari) einfüge, funktioniert der Download einwandfrei.
Wenn ich jedoch versuche, dieselbe URL über die Befehlszeile herunterzuladen curl
, funktioniert dies nicht. Das Ergebnis ist eine leere Datei:
$ 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
$
Natürlich kann ich die Datei über den Browser abrufen, aber ich möchte verstehen, warum der curl
obige Befehl nicht funktioniert.
Warum kann curl
diese Datei nicht korrekt heruntergeladen werden, wenn sie offensichtlich auf der Website vorhanden ist und über einen grafischen Webbrowser korrekt aufgerufen und heruntergeladen werden kann?
User-Agent
. Darüber hinaus können einige Browser-Downloads erfolgreich sein, da Sitzungscookies (dh, wenn Sie angemeldet sind) nur in diesem Browser vorhanden sind.curl -v
"verbose" verwenden. Es werden verschiedene Informationen zu Verbindung, Anforderung und Antwort auf Standardfehler gedruckt. In diesem Fall sehen Sie, dass die AntwortHTTP 302 Found
(einen Weiterleitungscode) und einenLocation
Header mit der URL enthält, zu der Sie wechseln möchten . Dann können Sieman curl
herausfinden, wie Sie festlegen können, dass Weiterleitungen folgen sollen.Antworten:
Es gibt eine Umleitung auf dem Webserver-Seite auf die folgende URL:
http://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.16-osx10.11-x86_64.dmg
. Da es sich um ein CDN handelt, hängt das genaue Verhalten (ob Sie umgeleitet werden oder nicht) möglicherweise von Ihrem Standort ab.curl
folgt standardmäßig keinen Weiterleitungen. Fügen Sie dazu das folgende-L
Argument hinzu:quelle
Wenn der Browser die Datei herunterladen kann, können Sie überprüfen, was der Browser tut. Auf Google Chrome können Sie Folgendes verwenden, um zu sehen, was passiert.
1) [Ansicht> Entwickler> Entwicklertools> Registerkarte Netzwerk> Registerkarte Header]
2) Klicken Sie auf den Download-Link.
3) Der Dateilink wird auf der Registerkarte Entwicklertools angezeigt.
4) Klicken Sie mit der rechten Maustaste auf die Datei und wählen Sie Kopieren> Als CURL kopieren.
Jetzt haben Sie einen Curl-Link, der funktioniert. Es wird wahrscheinlich überschüssige Parameter geben, die Sie wegschneiden können.
Weitere Details: https://lornajane.net/posts/2013/chrome-feature-copy-as-curl
quelle
Ich werde einen der Kommentare zu diesem Beitrag in eine Antwort umwandeln.
Es gibt viele HTTP / HTTPS-Links, für deren Funktion bestimmte Header erforderlich sind. Dies führt zu einer funktionierenden Antwort von einem Webbrowser, aber nicht zu einer funktionierenden Antwort in einer Back-End-Webanforderung wie curl.
Ich bin gerade auf eine Site gestoßen, für die alle folgenden Header erforderlich waren. Die Nichtangabe führte zu einer Zeitüberschreitung.
quelle