首页/系统/Linux 运维命令速查/curl 通用 HTTP 客户端
网络命令82 条

curl 通用 HTTP 客户端

运维最常用的网络请求工具:支持 HTTP/HTTPS/FTP/文件上传下载、代理、重定向、cookie、断点续传;调试接口常用手段。

Linux 运维命令速查系统更新于 2026-10-13

curl 是什么

curl 是命令行的 URL 传输客户端,支持 HTTP/HTTPS、FTP/S、SCP/SFTP 等协议,能走代理、带 cookie、做认证、跟随重定向、断点续传。它之所以成为接口调试与下载的默认工具,在于无交互、输出可管道化、退出码可用:一条命令就能把结果写文件、交给 jq 解析,或只取状态码做判断。两个默认行为必须记牢——不跟随重定向,以及 HTTP 层的 4xx/5xx 不算命令失败,不额外处理就会误判成功。

基本信息

适用平台Linux、macOS、Windows 均可(curl 7.x/8.x);多数发行版需单独安装 curl 包
命令语法curl [选项] URL
常用选项-s 静默、-S 保留错误输出、-L 跟随重定向、-o 输出到文件、-O 用远端文件名、-I 只看响应头、-i 头与体都要、-v 详细过程、-X 指定方法、-H 自定义头、-d 请求体、-F 表单上传、-w 自定义输出
超时与重试--max-time 总超时、--connect-timeout 连接超时、--retry 重试次数、--retry-connrefused 连不上也重试
权限要求普通用户即可执行;下载到受保护目录或绑定低位端口时才需要相应权限

典型使用场景

  • 接口自测:-X POST 配 -H 与 -d 直接发 JSON,不用打开浏览器或 Postman 就能验证接口返回
  • 健康检查:-o /dev/null 加 -w 取状态码与耗时,脚本据此判断服务是否可用
  • 文件下载:-O 保留远端文件名,-L 跟随 CDN 跳转,-C - 断点续传大文件
  • 证书与握手排查:-v 看 TLS 协商细节,--resolve 把域名强制解析到指定 IP 做灰度验证
  • 抓取响应头:-I 只看头信息,确认状态码、Content-Length、缓存与跳转链路
  • 内网访问:-x 指定代理,或配合 --cacert 使用自签 CA 访问内部 HTTPS 服务

常用示例

常用示例
curl -sS https://example.com                       # 静默但保留错误
curl -sS -o page.html https://example.com          # 保存响应到文件
curl -sSL https://example.com                      # 跟随 301/302
curl -sS --max-time 10 --retry 2 https://api.example.com/health
curl -sf -o /dev/null -w 'code=%{http_code} time=%{time_total}s\n' https://example.com
curl -sS -X POST -H 'Content-Type: application/json' -d '{"id":1}' https://api.example.com/v1/query
curl -sSI https://example.com                      # 只看响应头
curl -sS -O -L https://example.com/big.iso         # 下载并保留远端文件名
curl -sS -C - -O https://example.com/big.iso       # 断点续传
curl -sS -v --resolve example.com:443:10.0.0.7 https://example.com   # 指定解析结果做验证

常用选项对照

选项作用注意
-s静默模式,不显示进度条会连错误信息一起吞掉,务必配 -S
-L跟随重定向,默认最多 50 跳漏写时 301 响应体为空,容易被当成接口挂了
-fHTTP 状态码 4xx/5xx 时返回非 0 退出码脚本判成功必须加
-I只请求响应头(HEAD 方法)部分服务不支持 HEAD,会返回 405
-w自定义输出格式变量常与 -o /dev/null 搭配提取指标
-k跳过 TLS 证书校验仅测试环境可用,生产用 --cacert 指定信任链

常用输出变量

变量含义用途
%{http_code}HTTP 响应状态码判断接口是否正常
%{time_total}本次请求总耗时(秒)做性能基线与阈值告警
%{time_connect}TCP 连接建立耗时区分是网络慢还是服务慢
%{size_download}下载字节数确认响应体是否完整
%{num_redirects}重定向次数排查跳转链路异常
curl 的退出码描述的是传输层面是否成功:能收到 HTTP 响应(哪怕是 500)通常仍返回 0。脚本里判断业务成功要加 -f 让 4xx/5xx 变成退出码 22,或解析 -w 输出的 http_code 自己判断,两者不要漏。
传参方式有三种,语义不同:-d 把内容作为请求体(默认表单编码,配合 -H 'Content-Type: application/json' 发 JSON),--data-binary 保留文件原样不做换行处理,-F 走 multipart 用于文件上传。跟老系统对接时表单与 JSON 的差异经常是 400 的根源。
URL 里带 & 时必须整体加引号,否则 shell 会把后半段当作后台执行并截断请求;带 token 的 URL 也会因此泄漏到命令历史里。敏感参数优先用 -H 'Authorization: ...' 或 --config 从文件读取。

易错点

  • 默认不跟随重定向(要显式加 -L),拿到空 body 的 301 响应常被误判为服务异常
  • URL 里的 & 不加引号会被 shell 拆成后台执行,请求参数被截断且可能触发意外命令;一律用单引号包住完整 URL
  • 只看退出码判断成功:HTTP 500 时 curl 也可能返回 0,脚本必须加 -f 或检查 %{http_code}
  • 用 -k 跳过证书校验掩盖了真实问题(证书过期、域名不匹配),生产环境应修证书或用 --cacert 指定信任链
  • 只写 -s 会连错误信息一起吞掉,排查时用 -sS 组合;需要看完整交互过程再加 -v

数据来源与参考

  • curl 官方文档(curl.se/docs/manpage.html)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌