Perché non arricciare scaricare questo link quando lo farà un browser?


30

Sto eseguendo Mac OS 10.11.6 El Capitan. C'è un link che vorrei scaricare a livello di codice:

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

Se incollo questo URL in qualsiasi browser (ad esempio Safari), il download funziona perfettamente.

Tuttavia, se provo a scaricare lo stesso URL dalla riga di comando utilizzando curl, non funziona, il risultato è un file vuoto:

$ 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
$ 

Ovviamente posso ottenere il file tramite il browser, ma vorrei capire perché il curlcomando sopra non funziona.

Perché non è possibile curlscaricare correttamente questo file, quando è evidentemente presente sul sito Web e può essere correttamente accessibile e scaricato tramite un browser grafico?


7
Vorrei sottolineare che anche se la risposta di techraf sui reindirizzamenti è completamente corretta, altri fattori come le intestazioni possono far sì che un server respinga la richiesta del client arricciato di scaricare un file. Ad esempio, se il server ha una protezione DDoS back-end, tale software di protezione verifica comunemente la presenza di intestazioni del browser valide, ad esempio una corretta User-Agent. Inoltre, alcuni download del browser potrebbero avere esito positivo a causa della presenza dei cookie di sessione (ad esempio, se si è effettuato l'accesso) solo su tale browser.
Joseph A.

6
Per risolvere un comando di arricciatura, è possibile utilizzare curl -vper "dettagliato". Stamperà sull'errore standard varie informazioni sulla connessione, richiesta e risposta. In questo caso, vedresti che la risposta include HTTP 302 Found(un codice di reindirizzamento) e Locationun'intestazione con l'URL a cui andare. Quindi potresti man curlscoprire come dirlo per seguire i reindirizzamenti.
Nathan Long,

Risposte:


59

C'è un redirect sul web server-side al seguente URL: http://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.16-osx10.11-x86_64.dmg. Poiché si tratta di una CDN, il comportamento esatto (se vieni reindirizzato o meno) potrebbe dipendere dalla tua posizione.

curlnon segue i reindirizzamenti per impostazione predefinita. Per dirgli di farlo, aggiungi l' -Largomento:

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

6
Un reindirizzamento da HTTPS a HTTP? È terribile, e non mi sorprende che Curl lo lasci bene da solo ...
Toby Speight,

E se questo non lo risolve? Qualcosa a che fare con le cose .asp forse?
matematico

4

Se il browser è in grado di scaricare il file, è possibile controllare cosa sta facendo il browser. Su Google Chrome puoi utilizzare quanto segue per vedere cosa sta succedendo.

1) [Visualizza> Sviluppatore> Strumenti per sviluppatori> Scheda Rete> Scheda Intestazioni]

2) Fare clic sul collegamento per il download.

3) Il collegamento al file apparirà nella scheda degli strumenti di sviluppo.

4) Fare clic destro sul file e selezionare Copia> Copia come cURL.

Ora hai un collegamento a ricciolo che funzionerà. Probabilmente avrà parametri in eccesso che puoi tagliare.

Maggiori dettagli: https://lornajane.net/posts/2013/chrome-feature-copy-as-curl


0

Ho intenzione di convertire uno dei commenti su questo post in una risposta.

Esistono molti collegamenti HTTP / HTTPS che richiedono determinate intestazioni per funzionare. Quindi questo si tradurrà in una risposta funzionante da un browser web ma non in una risposta funzionante in una richiesta web back-end come il ricciolo.

Ho appena incontrato un sito che richiedeva tutte le seguenti intestazioni. La mancata specificazione ha comportato un timeout.

  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");
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.