当您需要从终端下载文件、测试 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-8301 状态和 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 速查表。
| 任务 | 命令 |
|---|---|
| 获取 URL | curl 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 JSON | curl -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-Agent | curl -A "agent string" url |
| 发送 cookie | curl -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 忽略。