当您需要从终端下载文件、测试 API 端点或检查网站为何无响应时,curl 通常是首选工具。它是一个用于从服务器传输数据或向服务器传输数据的命令行工具,设计为无需用户交互即可工作,并支持包括 HTTP、HTTPS、SCP、SFTP 和 FTP 在内的协议。使用 curl,您可以恢复传输、限制带宽、使用代理、向服务器进行身份验证等。

在本指南中,我们将通过真实示例和您最常使用的选项来介绍 curl。

安装 Curl

curl 包在当今大多数 Linux 发行版中都已预装。

要检查您的系统上是否安装了 curl 包,请打开终端,输入 curl 并按 Enter。如果已安装 curl,系统将打印 curl: try 'curl --help' or 'curl --manual' for more information。否则,您将看到类似 curl command not found 的消息。

如果 curl 未安装,您可以使用您发行版的包管理器轻松安装它。

在 Ubuntu 和 Debian 上安装 Curl

终端
sudo apt update
sudo apt install curl

在 Fedora、RHEL 及其衍生版本上安装 Curl

终端
sudo dnf install curl

如何使用 Curl

curl 命令的语法如下:

curl [options] [URL...]

在其最简单的形式中,当不带任何选项调用时,curl 会将指定的资源显示到标准输出。

例如,要检索 example.com 的主页,您可以运行:

终端
curl example.com

该命令将在您的终端窗口中打印 example.com 主页的源代码。

如果未指定协议,curl 会尝试猜测您要使用的协议,并默认为 HTTP。

将输出保存到文件

要保存 curl 命令的结果,请使用 -o 或 -O 选项。

小写 -o 使用自定义文件名保存文件:

终端
curl -o output.html https://example.com/

大写 -O 使用 URL 中的原始文件名保存文件:

终端
curl -O https://go.dev/dl/go1.26.5.linux-amd64.tar.gz

下载多个文件

要一次下载多个文件,请使用多个 -O 选项,后跟要下载文件的 URL。

在以下示例中,我们正在下载 Arch Linux 和 Debian 的 ISO 文件:

终端
curl -O https://geo.mirror.pkgbuild.com/iso/latest/archlinux-x86_64.iso \
     -O https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-13.5.0-amd64-netinst.iso

恢复下载

您可以使用 -C - 选项恢复下载。如果您在下载大文件时连接中断,这非常有用,您不必从头开始下载,而是可以继续之前的下载。

例如,如果您使用以下命令下载 Ubuntu 24.04 ISO 文件:

终端
curl -O https://releases.ubuntu.com/noble/ubuntu-24.04.4-live-server-amd64.iso

并且您的连接突然中断,您可以使用以下命令恢复下载:

终端
curl -C - -O https://releases.ubuntu.com/noble/ubuntu-24.04.4-live-server-amd64.iso

获取 URL 的 HTTP 标头

HTTP 标头是以冒号分隔的键值对,包含诸如 User-Agent、内容类型和编码等信息。标头随请求或响应在客户端和服务器之间传递。

使用 -I 选项仅获取指定资源的 HTTP 标头:

终端
curl -I https://www.ubuntu.com/
输出
HTTP/2 301
server: nginx/1.14.0 (Ubuntu)
date: Sat, 11 Jul 2026 14:19:08 GMT
content-type: text/html
content-length: 162
location: https://ubuntu.com/
strict-transport-security: max-age=15724800

每一行都是一个标头字段。第一行显示 HTTP 版本和状态码。

将响应标头保存到文件

如果您想稍后检查标头,请使用 -D 将它们保存到文件中:

终端
curl -D headers.txt https://www.ubuntu.com/ -o /dev/null

测试网站是否支持 HTTP/2

要检查特定 URL 是否支持 HTTP/2 协议,请使用 -I 选项并将 --http2 选项一起使用来获取 HTTP 标头:

终端
curl -I --http2 -s https://www.ggdoc.cn/ | grep HTTP

-s 选项告诉 curl 以静默模式运行,并隐藏进度条和错误消息。

如果远程服务器支持 HTTP/2,curl 会打印 HTTP/2 200:

输出
HTTP/2 200

否则,响应将是 HTTP/1.1 200:

输出
HTTP/1.1 200 OK

如果您有 curl 版本 7.47.0 或更高版本,则无需使用 --http2 选项,因为对于所有 HTTPS 连接,HTTP/2 默认已启用。

您可以以相同方式测试 HTTP/3。如果您的 curl 构建包含 HTTP/3 支持,请将 --http2 替换为 --http3,并在输出中查找 HTTP/3 200。

显示状态码和时间

要查看状态码和基本时间信息而不打印响应正文,请将 -w 与 -o /dev/null 一起使用:

终端
curl -sS -o /dev/null -w "status=%{http_code} time=%{time_total}s\n" https://www.ggdoc.cn/

跟随重定向

默认情况下,curl 不会跟随 HTTP Location 标头。

如果您尝试检索 google.com 的非 www 版本,您会注意到,您不会获得页面源代码,而是被重定向到 www 版本:

终端
curl -I google.com
输出
HTTP/1.1 301 Moved Permanently
Location: http://www.google.com/
Content-Type: text/html; charset=UTF-8

301 状态和 Location 标头表明 google.com 重定向到 www.google.com。默认情况下,curl 在这里停止,不会跟随重定向。

-L 选项指示 curl 跟随任何重定向,直到到达最终目的地:

终端
curl -L google.com

更改 User-Agent

有时在下载文件时,远程服务器可能设置为阻止 curl User-Agent,或根据访问者设备和浏览器返回不同的内容。

在这种情况下,为了模拟不同的浏览器,请使用 -A 选项。

例如,要模拟 Firefox,您可以使用:

终端
curl -A "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0" https://fedoraproject.org/

指定最大传输速率

--limit-rate 选项允许您限制数据传输速率。该值可以以字节表示,使用 k 后缀表示千字节,使用 m 后缀表示兆字节,使用 g 后缀表示千兆字节。

在以下示例中,curl 将下载 Go 二进制文件并将下载速度限制为 1 MB:

终端
curl --limit-rate 1m -O https://go.dev/dl/go1.26.5.linux-amd64.tar.gz

此选项有助于防止 curl 消耗所有可用带宽。

通过 FTP 传输文件

要使用 curl 访问受保护的 FTP 服务器,请使用 -u 选项并指定用户名和密码,如下所示:

终端
curl -u FTP_USERNAME:FTP_PASSWORD ftp://ftp.example.com/

登录后,该命令会列出用户主目录中的所有文件和目录。

您可以使用以下语法从 FTP 服务器下载单个文件:

终端
curl -u FTP_USERNAME:FTP_PASSWORD ftp://ftp.example.com/file.tar.gz

要上传文件到 FTP 服务器,请使用 -T 后跟要上传的文件名:

终端
curl -T newfile.tar.gz -u FTP_USERNAME:FTP_PASSWORD ftp://ftp.example.com/
警告-u 传递的凭据会保存在您的 shell 历史记录中,并且进程列表中的其他用户可以看到。FTP 也会以明文传输这些凭据,因此如果服务器支持,请优先使用 SFTP 或 FTPS。

发送 Cookies

有时您可能需要使用特定 cookies 发起 HTTP 请求以访问远程资源或调试问题。

默认情况下,使用 curl 请求资源时,不会发送或存储任何 cookies。

要向服务器发送 cookies,请使用 -b 开关,后跟包含 cookies 的文件名或字符串。

例如,要随请求发送会话 cookie:

终端
curl -b "session_id=abc123" https://httpbin.org/cookies

您还可以从响应中保存 cookie,并在后续请求中重用它们:

# 将 cookie 保存到文件
curl -c cookies.txt https://example.com/login

# 在下一个请求中发送已保存的 cookie
curl -b cookies.txt https://example.com/dashboard

请求 JSON 数据

当您使用 API 时,请设置 Accept 标头并保持输出简洁:

curl -sS -H "Accept: application/json" https://api.github.com/repos/curl/curl

有关针对真实 API 的 GET、POST、PUT、PATCH 和 DELETE 示例,请参阅使用 curl 发起 REST API 请求。

发送基本认证凭据

如果服务器需要基本认证,请使用 -u 加上用户名:

curl -u "$API_USER" https://api.example.com/protected

当您省略密码时,curl 会提示您输入密码,而不会在终端中显示。

使用代理

curl 支持不同类型的代理,包括 HTTP、HTTPS 和 SOCKS。要通过代理服务器传输数据,请使用 -x(--proxy)选项,后跟代理 URL。

以下命令使用位于 192.168.44.1 端口 8888 的代理下载指定资源:

curl -x 192.168.44.1:8888 https://www.linux.com/

如果代理服务器需要认证,请使用 -U(--proxy-user)选项加上代理用户名:

curl -U "$PROXY_USER" -x 192.168.44.1:8888 https://www.linux.com/

如果参数中没有密码,curl 会提示输入代理密码。

发送 POST 请求

默认情况下,curl 发送 GET 请求。要使用 POST 请求发送数据,请使用 -d 选项。当存在 -d 时,curl 会自动切换到 POST,因此无需添加 -X POST:

curl -d "name=ggdoc&category=linux" https://httpbin.org/post

要发送 JSON 数据,请设置 Content-Type 标头:

curl -H "Content-Type: application/json" \
  -d '{"name":"ggdoc","category":"linux"}' \
  https://httpbin.org/post

您还可以使用 @ 从文件读取数据:

curl -H "Content-Type: application/json" -d @data.json https://httpbin.org/post

有关表单编码、multipart 上传以及从标准输入读取请求体的示例,请参阅 curl POST 请求示例。

设置超时

为了防止 curl 无限期挂起,您可以设置超时:

# 整个操作的最大时间(30 秒)
curl --max-time 30 https://example.com/

# 建立连接的最大时间(10 秒)
curl --connect-timeout 10 https://example.com/

# 同时设置两个限制
curl --connect-timeout 10 --max-time 60 https://example.com/

详细输出

-v 选项显示完整的请求和响应交换,包括 TLS 握手、请求标头和响应标头。它是调试连接问题最有用的标志:

curl -v https://example.com/ -o /dev/null -s
* Host example.com:443 was resolved.
* IPv4: 172.66.147.243, 104.20.23.154
*   Trying 172.66.147.243:443...
* ALPN: curl offers h2,http/1.1
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN: server accepted h2
* Server certificate:
*  subject: CN=example.com
*  issuer: C=US; O=CLOUDFLARE, INC.; CN=Cloudflare TLS Issuing ECC CA 1
*  SSL certificate verify ok.
* Connected to example.com (172.66.147.243) port 443
> GET / HTTP/2
> Host: example.com
> User-Agent: curl/8.14.1
> Accept: */*
>
< HTTP/2 200
< content-type: text/html
< server: cloudflare

以 * 开头的行是来自 curl 自身的连接详细信息。以 > 开头的行是发送到服务器的请求标头,以 < 开头的行是返回的响应标头。

-o /dev/null -s 部分会丢弃响应体并隐藏进度条,这样只保留调试输出。

故障排除

当传输失败时,curl 会打印一个错误代码,指向问题发生的阶段。以下是您最可能遇到的错误。

curl: (6) 无法解析主机
DNS 查找失败。检查 URL 是否有拼写错误,并确认您的系统上名称解析是否正常,例如使用 dig 或 ping 测试另一个域名。

curl: (7) 无法连接
主机名已解析,但没有接受连接。服务可能已关闭、监听在不同端口上,或被防火墙阻止。

curl: (28) 操作超时
传输超过了使用 --connect-timeout 或 --max-time 设置的限制,或者服务器停止响应。对于慢速服务器或大型下载,请提高限制。

curl: (60) SSL 证书问题
curl 无法验证服务器证书。检查 URL 主机名是否正确、系统时钟是否准确、CA 证书包是否是最新的。证书也可能已过期、自签名或为其他主机名签发。仅用于本地测试时,-k 可绕过此错误,但它会禁用证书验证,绝不应在生产连接中使用。

curl: (22) 请求的 URL 返回错误
此错误仅在 -f 选项下出现,表示服务器返回了 HTTP 状态码 400 或更高。要查看精确的状态码,请对 URL 运行 curl -sS -o /dev/null -w "%{http_code}\n"。

快速参考

如需可打印的快速参考,请参阅 curl 速查表。

任务命令
获取 URLcurl example.com
保存到文件(自定义名称)curl -o file.html example.com
保存到文件(原始名称)curl -O https://example.com/file.tar.gz
下载多个文件curl -O url1 -O url2
恢复下载curl -C - -O url
仅获取 HTTP 标头curl -I example.com
跟随重定向curl -L example.com
详细输出curl -v example.com
POST 表单数据curl -d "key=value" url
POST JSONcurl -H "Content-Type: application/json" -d '{}' url
基本认证curl -u "$API_USER" url
设置超时curl --max-time 30 url
限制带宽curl --limit-rate 1m -O url
使用代理curl -x proxy:port url
更改 User-Agentcurl -A "agent string" url
发送 cookiecurl -b "name=value" url
静默但显示错误curl -sS url

常见问题

curl 和 wget 有什么区别?
两者都可以从命令行下载文件。curl 支持更多协议、处理上传,更适合 API 工作和带管道的脚本编写。wget 在递归下载和镜像网站方面更简单。请参阅 curl 与 wget 对比以查看并排示例。

如何使用 curl 发送 Bearer 令牌?
在 Authorization 标头中传递令牌:

curl -H "Authorization: Bearer $API_TOKEN" https://api.example.com/data
警告请勿在脚本中硬编码 API 令牌,也不要将其提交到版本控制。请将其存储在环境变量或本地 .env 文件中,并确保该文件被 Git 忽略。