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 curl
comando anterior no funciona.
¿Por qué no puedo curl
descargar 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?
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.curl -v
para "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 incluyeHTTP 302 Found
(un código de redireccionamiento) y unLocation
encabezado con la URL a la que ir. Entonces podríaman curl
averiguar cómo decirle que siga las redirecciones.Respuestas:
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.curl
no sigue las redirecciones por defecto. Para decirle que lo haga, agregue el-L
argumento:fuente
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
fuente
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.
fuente