it-swarm.com.de

Warum wird Curl diesen Link nicht herunterladen, wenn ein Browser dies tut?

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 (z. B. Safari) einfüge, funktioniert der Download einwandfrei.

Wenn ich jedoch versuche, dieselbe URL mit curl von der Befehlszeile herunterzuladen, 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 obige Befehl curl nicht funktioniert.

Warum kann curl diese Datei nicht korrekt herunterladen, wenn sie offensichtlich auf der Website vorhanden ist und über einen grafischen Webbrowser korrekt aufgerufen und heruntergeladen werden kann?

31
mattobob

Auf der Webserver-Seite wird auf die folgende URL umgeleitet: 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 (unabhängig davon, ob Sie umgeleitet werden oder nicht) von Ihrem Standort ab.

curl folgt standardmäßig keinen Weiterleitungen. Fügen Sie dazu das Argument -L Hinzu:

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

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 entfernen können.

Weitere Details: https://lornajane.net/posts/2013/chrome-feature-copy-as-curl

6
cage

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 also zu einer funktionierenden Antwort von einem Webbrowser, jedoch nicht zu einer funktionierenden Antwort in einer Backend-Webanforderung wie Curl.

Ich bin gerade auf eine Site gestoßen, die alle folgenden Header benötigt. Wenn Sie sie nicht angeben, tritt eine Zeitüberschreitung auf.

  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");
0