Почему бы не скручивать эту ссылку, когда браузер будет?


30

Я использую Mac OS 10.11.6 El Capitan. Есть ссылка, которую я хотел бы скачать программно:

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

Если я вставлю этот URL в любой браузер (например, Safari), загрузка будет работать отлично.

Тем не менее, если я пытаюсь загрузить тот же URL-адрес из командной строки с помощью curl, он не работает - в результате получается пустой файл:

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

Конечно , я могу получить файл через браузер, но я хотел бы понять , почемуcurl выше команда не работает.

Почему нельзя curlзагрузить этот файл правильно, когда он явно присутствует на веб-сайте и может быть правильно доступен и загружен через графический веб-браузер?


7
Я хотел бы отметить, что, хотя ответ techraf о перенаправлениях является полностью правильным, другие факторы, такие как заголовки, могут заставить сервер отклонить запрос клиента curl на загрузку файла. Например, если сервер имеет внутреннюю защиту от DDoS, такое программное обеспечение защиты обычно проверяет наличие заголовков браузера, например, наличие правильных User-Agent. Кроме того, загрузка некоторых браузеров может быть успешной из-за того, что файлы cookie сеанса (т. Е. Если вы вошли в систему) присутствуют только в указанном браузере.
Джозеф А.

6
Чтобы устранить неполадки с командой curl, вы можете использовать curl -vдля «verbose». Он выведет к стандартной ошибке различную информацию о соединении, запросе и ответе. В этом случае вы увидите, что ответ включает в себя HTTP 302 Found(код перенаправления) и Locationзаголовок с URL-адресом, по которому нужно перейти. Тогда вы могли man curlбы узнать, как сказать ему следовать перенаправлениям.
Натан Лонг

Ответы:


59

Существует редирект на веб - сервер стороне по следующему адресу: http://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.16-osx10.11-x86_64.dmg. Поскольку это CDN, точное поведение (независимо от того, перенаправлены вы или нет) может зависеть от вашего местоположения.

curlпо умолчанию не выполняет перенаправления. Чтобы сказать это, добавьте -Lаргумент:

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

6
Переадресация HTTPS-HTTP? Это ужасно, и я не удивлен, что Керл оставляет это в покое ...
Тоби Спейт

И если это не решит это? Может быть, что-то делать с .asp?
математика

4

Если браузер может загрузить файл, вы можете проверить, что делает браузер. В Google Chrome вы можете использовать следующее, чтобы увидеть, что происходит.

1) [Просмотр> Разработчик> Инструменты разработчика> вкладка Сеть> вкладка Заголовки]

2) Нажмите на ссылку для скачивания.

3) Ссылка на файл появится на вкладке инструментов разработчика.

4) Щелкните правой кнопкой мыши файл и выберите «Копировать»> «Копировать как cURL».

Теперь у вас есть ссылка, которая будет работать. Вероятно, у него будут лишние параметры, которые вы можете обрезать.

Более подробная информация: https://lornajane.net/posts/2013/chrome-feature-copy-as-curl


0

Я собираюсь преобразовать один из комментариев к этому посту в ответ.

Существует много HTTP / HTTPS-ссылок, для работы которых требуются определенные заголовки. Таким образом, это приведет к рабочему ответу от веб-браузера, но не к рабочему ответу на внутренний веб-запрос, такой как curl.

Я просто наткнулся на сайт, который требует все следующие заголовки. Невозможность указать их привела к таймауту.

  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");
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.