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 curlFedora、CentOS Stream、AlmaLinux 和 Rocky Linux:使用 DNF 安装 cURL
在 Fedora 41 及更高版本上,dnf命令已经映射到 DNF5,因此您可以依赖熟悉的语法:
sudo dnf install curlArch Linux 及其衍生产品:使用 Pacman 安装 cURL
sudo pacman -S curlAlpine Linux:使用 APK 安装 cURL
sudo apk add curlopenSUSE 和 SUSE Linux Enterprise:使用 Zypper 安装 cURL
sudo zypper install curlGentoo:使用 Portage 安装 cURL
sudo emerge net-misc/curlVoid 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.gzcURL 从左到右处理 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 历史记录或脚本中,以便在基础架构更改、临时环境和生产事件中更快地移动。
