저는 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
왜 이 파일을 제대로 다운로드 할 수 없나요 ?웹사이트에 시각적으로 존재하고 그래픽 웹 브라우저를 통해 올바르게 액세스하고 다운로드할 수 있는 경우는 언제입니까?
답변1
웹 서버 측에서 다음 URL로 리디렉션됩니다 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
답변2
브라우저가 파일을 다운로드할 수 있으면 브라우저가 수행하는 작업을 확인할 수 있습니다. Google Chrome에서는 다음 명령을 사용하여 무슨 일이 일어나고 있는지 확인할 수 있습니다.
1)[보기 > 개발자 > 개발자 도구 > 네트워크 탭 > 헤더 탭]
2) 다운로드 링크를 클릭하세요.
3) 개발자 도구 탭에 파일 링크가 나타납니다.
4) 파일을 마우스 오른쪽 버튼으로 클릭하고 복사 > cURL로 복사를 선택합니다.
이제 사용할 수 있는 컬 링크가 생겼습니다. 정리할 수 있는 중복 매개변수가 있을 수 있습니다.
자세한 내용은: https://lornajane.net/posts/2013/chrome-feature-copy-as-curl
답변3
이 게시물의 댓글 중 하나를 답변으로 변환하겠습니다.
특정 헤더가 작동해야 하는 HTTP/HTTPS 링크가 많이 있습니다. 따라서 이로 인해 웹 브라우저에서는 유효한 응답이 발생하지만, 컬과 같은 백엔드 웹 요청에서는 그렇지 않습니다.
방금 다음 헤더가 모두 필요한 웹 사이트를 발견했습니다. 이를 지정하지 않으면 시간 초과가 발생합니다.
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");