使用 curl 命令行工具访问互联网

下载我们新的 curl 速查表。Curl 是一种快速有效的方式,可以从互联网上拉取您需要的信息,而无需使用图形界面。
135 位读者喜欢这个。
Blender Hotkey Cheat Sheet

Opensource.com

Curl 通常被认为是非交互式 Web 浏览器。这意味着它能够从互联网上拉取信息,并在您的终端中显示或将其保存到文件中。这实际上是 Web 浏览器(如 Firefox 或 Chromium)所做的事情,只不过它们默认情况下渲染信息,而 curl 下载并显示原始信息。实际上,curl 命令的功能远不止于此,它能够使用多种受支持的协议(包括 HTTP、FTP、SFTP、IMAP、POP3、LDAP、SMB、SMTP 等)将数据传输到服务器或从服务器传输数据。对于普通终端用户来说,它是一个有用的工具;对于系统管理员来说,它是一个至关重要的便利工具;对于微服务和云开发人员来说,它是一个质量保证工具。

Curl 旨在无需用户交互即可工作,因此与 Firefox 不同,您必须从头到尾考虑您与在线数据的交互。例如,如果您想在 Firefox 中查看网页,您需要启动一个 Firefox 窗口。Firefox 打开后,您需要在 URL 字段或搜索引擎中输入您想访问的网站。然后,您导航到该站点并单击您想看到的页面。

相同的概念适用于 curl,只不过您一次性完成所有操作:您启动 curl 的同时,向其提供您想要的互联网位置,并告诉它您是否希望将数据保存在终端中还是文件中。当您必须与需要身份验证的站点或 API 交互时,复杂性会增加,但是一旦您学会了 curl 命令语法,它就会成为第二天性。为了帮助您掌握它,我们收集了相关的语法信息,并将其整理在一份方便的 速查表 中。

使用 curl 下载文件

您可以使用 curl 命令下载文件,方法是提供指向特定 URL 的链接。如果您提供默认指向 index.html 的 URL,则会下载索引页面,并且您下载的文件将显示在您的终端屏幕上。您可以将输出管道传输到 less 或 tail 或任何其他命令

$ curl "http://example.com" | tail -n 4
    <h1>Example Domain</h1>
    <p>This domain is for use in illustrative examples in documents. You may use this domain in literature without prior coordination or asking for permission.</p>
    <p><a href="https://www.iana.org/domains/example">More information...</a></p>
</div></body></html>

由于某些 URL 包含您的 shell 通常会解释的特殊字符,因此最安全的方法是将您的 URL 括在引号中。

某些文件不能很好地转换为在终端中显示。您可以使用 --remote-name 选项使文件根据其在服务器上的名称保存

$ curl --remote-name "https://example.com/linux-distro.iso"
$ ls 
linux-distro.iso

或者,您可以使用 --output 选项将您的下载命名为您想要的任何名称

curl "http://example.com/foo.html" --output bar.html

使用 curl 列出远程目录的内容

由于 curl 是非交互式的,因此很难浏览页面以查找可下载的元素。假设您连接的远程服务器允许这样做,您可以使用 curl 列出目录的内容

$ curl --list-only "https://example.com/foo/"

继续部分下载

如果您正在下载一个非常大的文件,您可能会发现您必须中断下载。Curl 足够智能,可以确定您上次中断的位置并继续下载。这意味着下次您下载 4GB Linux 发行版 ISO 时,如果出现问题,您永远不必回到起点。--continue-at 的语法有点不寻常:如果您知道下载中断的字节计数,您可以提供它;否则,您可以使用一个单独的短划线 (-) 来告诉 curl 自动检测它

$ curl --remote-name --continue-at - "https://example.com/linux-distro.iso"

下载文件序列

如果您需要下载多个文件——而不是仅仅一个大文件——curl 可以帮助您完成这项工作。假设您知道您要下载的文件的位置和文件名模式,您可以使用 curl 的序列表示法:整数范围之间的起点和终点,用方括号括起来。对于输出文件名,请使用 #1 来指示第一个变量

$ curl "https://example.com/file_[1-4].webp" --output "file_#1.webp"

如果您需要使用另一个变量来表示另一个序列,请按照变量在命令中出现的顺序表示每个变量。例如,在此命令中,#1 指的是目录 images_000images_009,而 #2 指的是文件 file_1.webpfile_4.webp

$ curl "https://example.com/images_00[0-9]/file_[1-4].webp" \
--output "file_#1-#2.webp"

从站点下载所有 PNG 文件

您也可以做一些基本的网页抓取来查找您想要下载的内容,只需使用 curlgrep。例如,假设您需要下载与您正在存档的网页关联的所有图像。首先,下载引用图像的页面。将该页面通过管道传输到 grep,搜索您要定位的图像类型(在本例中为 PNG)。最后,创建一个 while 循环来构建下载 URL 并将文件保存到您的计算机

$ curl https://example.com |\
grep --only-matching 'src="[^"]*.[png]"' |\
cut -d\" -f2 |\
while read i; do \
curl https://example.com/"${i}" -o "${i##*/}"; \
done

这只是一个示例,但它演示了当 curl 与 Unix 管道和一些巧妙但基本的解析结合使用时,可以有多么灵活。

获取 HTML 标头

用于数据交换的协议在计算机发送以进行通信的数据包中嵌入了大量元数据。HTTP 标头是数据初始部分的组成部分。当您对站点的连接进行故障排除时,查看这些标头(尤其是响应代码)可能会有所帮助

curl --head "https://example.com"
HTTP/2 200 
accept-ranges: bytes
age: 485487
cache-control: max-age=604800
content-type: text/html; charset=UTF-8
date: Sun, 26 Apr 2020 09:02:09 GMT
etag: "3147526947"
expires: Sun, 03 May 2020 09:02:09 GMT
last-modified: Thu, 17 Oct 2019 07:18:26 GMT
server: ECS (sjc/4E76)
x-cache: HIT
content-length: 1256

快速失败

200 响应是 HTTP 通常表示成功的指示,因此这是您联系服务器时通常期望的结果。著名的 404 响应表示找不到页面,而 500 表示服务器错误。

要查看协商期间发生的错误,请添加 --show-error 标志

$ curl --head --show-error "http://opensource.ga"

除非您可以访问您正在联系的服务器,否则这些错误可能很难修复,但 curl 通常会尽力解析您指向的位置。有时,在网络上测试某些内容时,看似无休止的重试只是浪费时间,因此您可以使用 --fail-early 选项强制 curl 在失败时快速退出

curl --fail-early "http://opensource.ga"

重定向 3xx 响应指定的查询

但是,300 系列响应更灵活。具体来说,301 响应表示 URL 已永久移动到不同的位置。这是网站管理员在重新定位内容时留下“踪迹”以便访问旧位置的人仍然可以找到它的常用方法。Curl 默认情况下不遵循 301 重定向,但您可以使用 --location 选项使其继续前往 301 目标

$ curl "https://iana.org" | grep title
<title>301 Moved Permanently</title>
$ curl --location "https://iana.org"
<title>Internet Assigned Numbers Authority</title>

展开缩短的 URL

当您想在访问缩短的 URL 之前查看它们时,--location 选项非常有用。缩短的 URL 对于有字符限制的社交网络(当然,如果您使用 现代开源社交网络,这可能不是问题)或用户无法简单地复制和粘贴长 URL 的印刷媒体非常有用。但是,它们也可能有点危险,因为它们的目的地本质上是隐藏的。通过结合 --head 选项来仅查看 HTTP 标头和 --location 选项来解开 URL 的最终目的地,您可以窥视缩短的 URL,而无需加载完整资源

$ curl --head --location \
"https://bit.ly/2yDyS4T"

下载我们的 curl 速查表

一旦您练习将探索 Web 的过程视为单个命令,curl 就会成为一种快速有效的方式,可以从互联网上拉取您需要的信息,而无需费心使用图形界面。为了帮助您将其构建到您的常用工作流程中,我们创建了一个 curl 速查表,其中包含常见的 curl 用法和语法,包括使用它来查询 API 的概述。

接下来阅读什么

从 Linux 终端阅读 Reddit

在我们关于 2020 年通过开源提高工作效率的 20 种方法的系列文章的第十一篇中,使用 Reddit 客户端 Tuir 从工作中短暂休息一下。

Seth Kenlon
Seth Kenlon 是一位 UNIX 极客、自由文化倡导者、独立多媒体艺术家和 D&D 爱好者。他曾在电影和计算机行业工作,而且经常同时从事这两个行业。

7 条评论

我从不知道 curl 在命令行中有这么多用途,我只知道它用于检查标头....

很棒的文章。不是通常的 curl 内容... 可能在其他项目中可能有用的新想法和标志。谢谢。

想看看 --head --location 运行的结果,但没找到.... 这是一个 DIY 预告片吗?

也感谢速查表...

如果您运行我的示例,它应该会指向您 example.com。这是我的输出。看看“Location:”行

$ curl --head --location \
> "https://bit.ly/2yDyS4T"
HTTP/1.1 301 Moved Permanently
Server: nginx
Date: Tue, 26 May 2020 18:47:39 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 106
Cache-Control: private, max-age=90
Content-Security-Policy: referrer always;
Location: http://example.com/
[ 为了清晰起见已截断 ]

回复 作者:R (未验证)

嗨,Seth。我明白你的意图是好的。但是 CURL 无法解析 JavaScript。因此,在 React 和 Vue 等 JS 框架的时代,这篇文章可能会误导更多人,而不是帮助他们。

我没有看到我在本文中声称 Curl 可以解析 Javascript。我错过了什么吗?

回复 作者:Kamil Khan (未验证)

不错的文章。感谢分享。

非常感谢!非常有用

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.