我运行的是 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
Web 服务器端有一个重定向到以下 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”。
现在你有了一个可以使用的curl 链接。它可能会有多余的参数,您可以修剪掉。
更多细节: https://lornajane.net/posts/2013/chrome-feature-copy-as-curl
答案3
我将把这篇文章的评论之一转换为答案。
有许多 HTTP/HTTPS 链接需要某些标头才能工作。因此,这将导致 Web 浏览器产生有效响应,但不会产生像curl 这样的后端 Web 请求中的有效响应。
我刚刚遇到一个需要以下所有标头的网站。未能指定它们会导致超时。
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");