¿Por qué no se descarga este enlace cuando un navegador sí lo hace?

30

Estoy ejecutando Mac OS 10.11.6 El Capitan. Hay un enlace que me gustaría descargar mediante programación:

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

Si pego esta URL en cualquier navegador (por ejemplo, Safari), la descarga funciona perfectamente.

Sin embargo, si intento descargar la misma URL desde la línea de comandos curl, no funciona; el resultado es un archivo vacío:

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

Por supuesto, puedo obtener el archivo a través del navegador, pero me gustaría entender por qué el curlcomando anterior no funciona.

¿Por qué no puedo curldescargar este archivo correctamente cuando evidentemente está presente en el sitio web y se puede acceder y descargar correctamente a través de un navegador web gráfico?

mattobob
fuente
77
Me gustaría señalar que, aunque la respuesta de techraf en los redireccionamientos es completamente correcta, otros factores, como los encabezados, pueden hacer que un servidor rechace la solicitud del cliente curl de descargar un archivo. Por ejemplo, si el servidor tiene protección DDoS de back-end, dicho software de protección comúnmente busca encabezados de navegador viables, como tener un apropiado User-Agent. Además, algunas descargas del navegador pueden tener éxito debido a que las cookies de sesión (es decir, si ha iniciado sesión) solo están presentes en dicho navegador.
Joseph A.
66
Para solucionar problemas de un comando curl, puede usarlo curl -vpara "detallado". Imprimirá en el error estándar información variada sobre la conexión, solicitud y respuesta. En este caso, vería que la respuesta incluye HTTP 302 Found(un código de redireccionamiento) y un Locationencabezado con la URL a la que ir. Entonces podría man curlaveriguar cómo decirle que siga las redirecciones.
Nathan Long

Respuestas:

59

Hay una redirección en el lado del servidor web a la dirección URL siguiente: http://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.16-osx10.11-x86_64.dmg. Debido a que es un CDN, el comportamiento exacto (ya sea que sea redirigido o no) puede depender de su ubicación.

curlno sigue las redirecciones por defecto. Para decirle que lo haga, agregue el -Largumento:

curl -L -O https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.16-osx10.11-x86_64.dmg
techraf
fuente
66
¿Una redirección HTTPS a HTTP? Eso es horrible, y no me sorprende que Curl lo deje bien solo ...
Toby Speight
¿Y si esto no lo resuelve? ¿Algo que ver con cosas de .asp tal vez?
Maththick
4

Si el navegador puede descargar el archivo, puede inspeccionar lo que está haciendo el navegador. En google chrome puede usar lo siguiente para ver qué está sucediendo.

1) [Ver> Desarrollador> Herramientas de desarrollador> Pestaña Red> pestaña Encabezados]

2) Haga clic en el enlace de descarga.

3) El enlace del archivo aparecerá en la pestaña de herramientas del desarrollador.

4) Haga clic derecho en el archivo y seleccione Copiar> Copiar como cURL.

Ahora tiene un enlace curl que funcionará. Probablemente tendrá un exceso de parámetros que puede recortar.

Más detalles: https://lornajane.net/posts/2013/chrome-feature-copy-as-curl

jaula
fuente
0

Voy a convertir uno de los comentarios de esta publicación en una respuesta.

Hay muchos enlaces HTTP / HTTPS que requieren ciertos encabezados para funcionar. Por lo tanto, esto dará como resultado una respuesta funcional de un navegador web, pero no una respuesta funcional en una solicitud web de fondo como curl.

Me encontré con un sitio que requería todos los siguientes encabezados. Si no se especifican, se produjo un tiempo de espera.

  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");
Nicholas DiPiazza
fuente