Linux 中的 cURL 命令:带有示例的完整指南

Linux 中的 cURL 命令是在计算机和远程服务之间移动数据的可靠方法。无论您是拉取发布工件、调试 HTTP 标头,还是将脚本连接到表述性状态传输 (REST) API,cURL 都能提供跨发行版的可靠行为。本指南将引导您安装 cURL、了解支持每个命令的语法、编写 API 请求脚本以及调整基本下载之外的网络行为。

如果您想快速比较文件传输,请将此指南与我们的指南配对这样您就知道每种工具何时最适合。

检查您现有的安装

大多数 Linux 系统默认包含 cURL。在继续之前,请验证版本,以便了解哪些功能和协议支持可用:

curl --version

输出显示 cURL 版本、支持的协议和启用的功能:

curl 8.5.0 (x86_64-pc-linux-gnu) libcurl/8.5.0 OpenSSL/3.0.13 zlib/1.3
Release-Date: 2023-12-06
Protocols: dict file ftp ftps gopher gophers http https imap imaps mqtt pop3 pop3s rtsp smb smbs smtp smtps telnet tftp
Features: alt-svc AsynchDNS HSTS HTTP2 HTTPS-proxy IPv6 Largefile libz NTLM SSL threadsafe TLS-SRP UnixSockets

如果最小映像上缺少该命令,请使用您的发行版的包管理器安装它。

这些包管理器反映了 Windows 中熟悉的工具:Ubuntu 和 Debian 上的 APT 与 Windows Update 类似,而 DNF、Pacman、APK、Zypper、Portage 和 XBPS 分别是 Fedora 和基于 RHEL 的系统(Arch、Alpine、openSUSE、Gentoo 和 Void)的默认包管理器。

Ubuntu 和 Debian:使用 APT 安装 cURL

sudo apt update
sudo apt install curl

Fedora、CentOS Stream、AlmaLinux 和 Rocky Linux:使用 DNF 安装 cURL

在 Fedora 41 及更高版本上,dnf命令已经映射到 DNF5,因此您可以依赖熟悉的语法:

sudo dnf install curl

Arch Linux 及其衍生产品:使用 Pacman 安装 cURL

sudo pacman -S curl

Alpine Linux:使用 APK 安装 cURL

sudo apk add curl

openSUSE 和 SUSE Linux Enterprise:使用 Zypper 安装 cURL

sudo zypper install curl

Gentoo:使用 Portage 安装 cURL

sudo emerge net-misc/curl

Void Linux:使用 XBPS 安装 cURL

sudo xbps-install curl

软件包存储库会根据最新的安全修复程序对 cURL 进行修补,因此请将这些命令纳入您的定期维护计划中。

了解 cURL 语法

如果您是 cURL 的新手,请将其视为一个命令行下载管理器,它还支持 API、FTP、SMTP 等。只需描述您想要的内容,cURL 就会为您处理协议详细信息。

几乎每个 cURL 命令都遵循相同的结构:

curl [options] [URL]

为了更好地理解这一点,请将语法分为三个部分,以便您可以自信地组合标志:

  • 卷曲:二进制文件本身。许多 shell 已经将其包含在PATH,因此您可以从脚本或交互式终端调用它。
  • [选项]:改变行为的可选标志。链接任意数量的链接来处理身份验证、重定向、标头、输出文件或协议调整。
  • [网址]:目标端点。 cURL 在一次调用中接受多个 URL,并且您可以混合使用以下方案:https://,ftp://, 和dict://

最简单的是,cURL 获取资源并将其打印到标准输出:

curl https://example.com/status

从那里,您可以根据需要添加其他选项。一些最有用的标志包括:

  • -o file:将响应数据写入您选择的文件。
  • -O:使用远程名称将响应保存到文件中。
  • -L:自动遵循 HTTP 重定向。
  • -H:添加自定义请求头。
  • -d或者--data:发送请求正文(POST、PUT、PATCH)。
  • -u user:pass:提供 HTTP 基本身份验证凭据。
  • -I:仅获取响应标头。
  • -v:启用详细输出以进行故障排除。

为了快速参考,请记住一些常用标志,以便您可以更快地工作:

任务有用的选项他们做什么
下载-O,-o,--remote-name-all,--limit-rate控制文件名和带宽,以便可靠地完成大型传输。
API 和表格-d,--data-urlencode,--form,-H安全地发布数据并反映浏览器如何格式化请求。
验证-u,--oauth2-bearer,--cert处理基本身份验证、令牌或客户端证书的凭据。
调试-v,--trace,--fail-with-body捕获详细的流量详细信息,并在 API 中断时快速失败。
联网-x,--resolve,--interface在测试期间通过代理或自定义主机路由呼叫。

下载和上传文件

cURL 处理一次性下载和脚本化传输。下面的示例重点介绍您最常使用的下载工作流程。

将输出获取到终端

运行快速 GET 请求并将响应打印到标准输出:

curl https://example.com/status

或者,通过管道传输到jq、轻量级 JSON 解析器或类似工具,可直接在管道中格式化 JSON 响应。

使用远程或自定义名称保存文件

使用-O使用服务器文件名存储文件,或者-o指定您自己的名字:

# Keep the original filename
curl -O https://downloads.example.com/app.tar.gz

# Choose a custom output path
curl -o latest-release.tar.gz https://downloads.example.com/app.tar.gz

结合-L当下载链接通过短 URL 或 CDN 重定向时。

添加--fail-with-body停止 HTTP 错误并避免将错误页面保存为发布文件:

curl -L --fail-with-body -O https://downloads.example.com/app.tar.gz

限制 cURL 将遵循的重定向数量,以防止无限重定向循环:

curl -L --max-redirs 5 -O https://short.link/abc123

这可以防止恶意重定向链,同时仍然遵循合法的短 URL 或 CDN 路由。

恢复中断的下载

要恢复部分下载,只需添加-C -。当您执行此操作时,cURL 将检查本地文件并从上一个偏移量继续:

curl -C - -O https://downloads.example.com/app.tar.gz

这在连接不稳定或将大型工件拉到远程服务器时效果很好。通过检查来确保服务器支持 HTTP 范围请求Accept-Ranges依靠简历之前的标题。

一次下载多个文件

在单个命令中对多个 URL 进行排队,以便您可以暂存版本或同步工件,而无需在脚本中循环:

curl -O https://downloads.example.com/file1.tar.gz \
     -O https://downloads.example.com/file2.tar.gz

cURL 从左到右处理 URL。当您需要自动创建嵌套文件夹时,切换到-o /path/to/file.tar.gz对于每个 URL 并将这些路径与--create-dirs

显示下载进度

显示大量下载的进度条,以便您可以监控传输速度和剩余时间:

curl -# -O https://downloads.example.com/large-file.iso

-#flag 显示一个简单的进度条而不是详细的统计信息:

######################################################################## 100.0%

省略该标志即可查看详细的传输统计信息,包括速度、经过的时间和传输的字节数。

在后台运行下载

通过向后台发送命令来启动长时间传输并回收 shell:

curl -O https://downloads.example.com/image.qcow2 &

检查进度jobs -l或将任务带回前台fg如果您需要交互式进度条。对于远程服务器上长时间运行的下载,请考虑在终端多路复用器(如 tmux 或 screen)(即使在断开连接时也能保持终端会话处于活动状态的工具)内运行 cURL,以便会话在断开连接后仍可正常运行。

将文件上传到 HTTP 端点

将文件发送到接受 PUT 上传或基于表单的文件提交的服务器:

# HTTP PUT upload
curl -T backup.tar.gz https://uploads.example.com/backups/backup.tar.gz

# Multipart form upload
curl -F "[email protected]" https://uploads.example.com/api/import

-Fflag 镜像浏览器样式的表单提交,因此服务器会在文件旁边接收边界标记(分隔表单字段的分隔符)和元数据。

使用 Web API

cURL 是测试 API 端点、试验标头或脚本服务调用的最快方法。

发送自定义标头

添加一个或多个标头-H模拟浏览器请求或包含令牌:

curl -H "Accept: application/json" \
     -H "User-Agent: linuxcapable-cli" \
     https://api.example.com/v1/health

此模式使您的测试调用与生产客户端保持一致,特别是当服务检查用户代理或接受标头时。

管理 Cookie 和会话

从文件中读取 cookie 或内联发送轻量级会话数据:

# Send a simple cookie inline
curl -b "name=value" https://www.example.com

# Load cookies from a file generated by a previous request
curl -b cookies.txt https://www.example.com/dashboard

将 cookie 文件与-c在请求之间捕获来自服务器的更新。

# Save cookies from a login request
curl -c cookies.txt -d "user=admin&pass=secret" https://api.example.com/login

# Use saved cookies in subsequent requests
curl -b cookies.txt https://api.example.com/dashboard

-cflag 将服务器设置的 cookie 存储在文件中,使您可以跨多个命令维护经过身份验证的会话,而无需重新进行身份验证。

覆盖用户代理字符串

当服务根据客户端身份控制行为时,覆盖默认用户代理(向服务器标识客户端的字符串,类似于浏览器标识自身的方式):

curl -A "Mozilla/5.0" https://www.example.com

保留浏览器、CLI 工具或监控代理的可信字符串的简短列表,以便您可以快速重现问题。

在 POST 请求中发送 JSON

当 API 接受 JSON 有效负载时,显式设置方法、内容类型和正文数据:

curl -X POST https://api.example.com/v1/tickets \
     -H "Content-Type: application/json" \
     -d '{"title":"Network latency","priority":"high"}'

成功的 POST 返回创建的资源:

{
  "id": 1234,
  "title": "Network latency",
  "priority": "high",
  "status": "open",
  "created_at": "2025-11-15T10:30:45Z"
}

在 JSON 负载周围使用单引号可防止 shell 解释特殊字符。伸手去拿--data-binary如果正文包含转义换行符或需要保持不变。

提交表单数据

使用与浏览器相同的方式对表单字段进行编码--data-urlencode对于个人条目:

curl https://api.example.com/v1/search \
     --data-urlencode "query=error logs" \
     --data-urlencode "limit=25"

此方法处理空格、& 符号和特殊字符,而无需双引号整个有效负载。通过管道输出当您需要过滤大型结果集时。

从文件发送数据

当您将请求主体置于版本控制之下或从模板生成它们时,将 cURL 指向文件:

curl -X POST https://api.example.com/v1/import \
     -H "Content-Type: application/json" \
     -d @payload.json

@prefix 逐字读取文件内容,从而保持大型 JSON blob 和换行符较多的文件完好无损。

发送 DELETE 或 PUT 请求

当您需要与更新或删除资源的 RESTful 端点交互时,覆盖默认的 GET 方法:

# Delete a record
curl -X DELETE https://api.example.com/v1/tickets/42 \
     -H "Authorization: Bearer $API_TOKEN"

# Replace a record with PUT
curl -X PUT https://api.example.com/v1/tickets/42 \
     -H "Content-Type: application/json" \
     -d '{"status":"closed"}'

将这些动词与--fail-with-body当您希望自动化因 HTTP 错误而停止但仍捕获响应文本时。

处理身份验证和安全

API 通常需要凭据或更严格的传输层安全性 (TLS) 设置。 cURL 通过简洁的标志提供这些选项。

使用基本凭证进行身份验证

提供用户名和密码-u。如果省略密码,cURL 会提示输入密码:

curl -u admin https://api.example.com/v1/metrics

为了安全起见,请使用环境变量或凭据帮助程序来避免将机密存储在 shell 历史记录中。

发送 Bearer 或 API 令牌

大多数现代 API 都希望在 Authorization 标头中包含令牌:

curl https://api.example.com/v1/profile \
     -H "Authorization: Bearer $API_TOKEN"

导出会话中的令牌或从机密管理器中读取令牌以保持脚本可移植。

使用客户端证书

相互 TLS 端点需要证书和私钥:

curl https://secure.example.com/report \
     --cert /etc/ssl/certs/client.pem \
     --key /etc/ssl/private/client.key

在继续之前,请确认文件权限如果您的提供商需要这种布局,请将证书和密钥合并到单个 PEM 文件中。

验证 TLS 配置

cURL 默认验证 HTTPS 证书。使用-k(或者--insecure)仅适用于自签名实验室的短期测试,并记录绕过 TLS 验证时的风险。

只要有可能,请向颁发证书链提供--cacert相反,生产脚本永远不会跳过正确的验证。

将 cURL 指向受信任的证书包以保持验证启用:

curl --cacert /etc/ssl/certs/ca-bundle.crt https://staging.internal.example.local/health

如果您必须短暂绕过临时主机上的验证,请运行:

curl -k https://staging.internal.example.local/health

切换回--cacert或测试完成后立即获得受信任的证书。

故障排除和检查响应

当您需要检查标头或延迟时,详细诊断可以节省几分钟。

检查没有正文内容的响应标头

获取不带正文内容的响应标头以确认缓存、重定向或状态代码:

curl -I https://example.com/docs

输出显示响应标头:

HTTP/2 200
date: Fri, 15 Nov 2025 10:30:45 GMT
content-type: text/html; charset=UTF-8
server: nginx/1.24.0
cache-control: max-age=3600
etag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
x-frame-options: DENY
content-length: 12450

添加-L遵循重定向,直到到达最终目的地并检查最终标头。

将标头和响应正文保存到单独的文件中

将标头存储在一个文件中,将有效负载存储在另一个文件中,这对于脚本比较很有用:

curl -D response.headers \
     -o response.json \
     https://api.example.com/v1/summary

检查延迟和痕迹

打开详细模式以查看完整的请求和响应握手,或使用以下命令打印计时详细信息-w:

curl -v https://api.example.com/v1/health

详细输出揭示了完整的握手:

* Trying 192.0.2.15:443...
* Connected to api.example.com (192.0.2.15) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/certs/ca-certificates.crt
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN, server accepted to use h2
> GET /v1/health HTTP/2
> Host: api.example.com
> User-Agent: curl/8.5.0
> Accept: */*
>
< HTTP/2 200
< content-type: application/json
< date: Fri, 15 Nov 2025 10:30:45 GMT
<
{"status":"healthy","uptime":3600}

打印性能分析的时序详细信息:

curl -o /dev/null -sS -w "Total: %{time_total}s\n" \
     https://api.example.com/v1/health

输出显示精确的时序细分:

Total: 0.342s

展开格式字符串以捕获 DNS 解析、连接时间、TLS 握手和传输速度,以进行全面的性能分析。为了更深入的分析,添加--trace或者--trace-time这样您就可以区分环境之间的请求流。

检查 HTTP 状态代码

验证 URL 是否存在或通过仅打印状态代码来跟踪重定向链:

curl -o /dev/null -s -w "%{http_code}\n" https://example.com/page

这仅输出状态代码:

200

在脚本中使用此模式可以检查链接有效性、监视端点运行状况或在处理响应之前验证重定向。

控制网络行为

除了基本传输之外,cURL 还包括代理、协议协商、限制和可靠性标志。

通过代理路由流量

将 cURL 指向 HTTP 或 SOCKS 代理,并使用可选的身份验证凭据:

curl -x https://proxy.example.com:8080 \
     -U proxyuser:proxypass \
     https://api.example.com/v1/health

代理 URL 前缀为socks5h://通过 SOCKS 代理解析主机名(类似于 VPN 路由流量的方式)。

将代理凭据存储在环境变量或.netrc文件,以便它们远离 shell 历史记录和进程列表。

覆盖 DNS 解析

针对登台主机进行测试或通过提供自定义 DNS 条目强制特定后端:

curl --resolve api.example.com:443:192.0.2.15 \
     https://api.example.com/v1/health

在这种情况下,cURL 连接到192.0.2.15但仍然发送api.example.com位于主机标头中,非常适合蓝/绿切换或 CDN 故障排除。

限制传输速率

限制下载或上传以避免共享连接饱和:

curl --limit-rate 2m -O https://downloads.example.com/app.tar.gz

请注意,该值接受后缀,例如k,m, 或者g每秒千字节、兆字节或千兆字节。

重试暂时失败

使用指数退避自动重试片状下载:

curl --retry 5 --retry-delay 2 --retry-connrefused \
     -O https://downloads.example.com/tool.tar.gz

此命令最多重试下载五次,两次尝试之间暂停两秒,并且还会在连接拒绝时重试,这对速率受限的镜像很有帮助。

请求压缩响应

要求服务器进行 gzip 或 brotli 压缩,以节省大型 API 响应的带宽:

curl --compressed https://api.example.com/metrics

启用后,cURL 会自动协商支持的编码并在本地解压缩正文。

协商 HTTP 版本

当您需要确认协议支持时强制使用 HTTP/2 或 HTTP/3:

# Prefer HTTP/2
curl --http2 -I https://www.example.com

# Prefer HTTP/3 (requires cURL built with HTTP/3 support)
curl --http3 -I https://www.example.com

如果协商的协议与您的期望不同,请检查Alt-Svc标头或 CDN 配置。

设置连接超时

通过限制连接和总执行时间来防止脚本挂在慢速端点上:

curl --connect-timeout 5 --max-time 20 https://api.example.com/v1/health

此示例允许 5 秒建立 TCP 或 TLS 会话,并且在 cURL 因错误退出之前总共需要 20 秒。

在 HTTP 之外使用 cURL

除了 HTTP 之外,cURL 还支持其他几种协议,这在您自动化遗留系统或需要编写跨协议工作流程脚本时很有帮助。

与 FTP 服务器交互

当您遇到旧版 FTP 端点时列出目录或传输文件:

curl -u user:pass ftp://ftp.example.com/public/

添加-T上传或-O拉下文物。使用ftps://对于隐式 FTPS 服务器(通常在端口 990 上),或保留ftp://并添加--ssl用于升级标准连接的显式 FTPS 端点。

# Explicit FTPS example
curl --ssl -u user:pass ftp://ftp.example.com/public/report.csv -O

通过 SMTP 发送邮件

通过 SMTP 传送准备好的消息来自动更新状态或发出警报:

curl --url smtp://smtp.example.com \
     --mail-from [email protected] \
     --mail-rcpt [email protected] \
     -T email.txt \
     -u acct:Sup3rSecret

对于加密连接,交换smtps://用于加密会话并定期轮换凭证。

查询DICT词典

在脚本中保留轻量级查找,而无需提取全文依赖项:

curl dict://dict.org/d:latency

这会通过 DICT 协议返回简洁的定义或翻译,方便 CLI 实用程序或仪表板。

结论

Linux 中的 cURL 命令为您提供了一个工具,可以下载资产、调整 API 请求、通过代理重放流量以及验证 TLS 策略。将这些命令模式保留在您的 shell 历史记录或脚本中,以便在基础架构更改、临时环境和生产事件中更快地移动。