Linux curl 命令完全指南:从基础请求到高级交互
概述
curl(CommandLine URL)是 Linux 系统中最强大的命令行网络传输工具,1997 年首次发布,凭借 “支持多协议、功能全面、可脚本化” 的特性,成为开发者、运维人员处理 URL 请求的必备工具。其核心价值体现在:
- 多协议全覆盖:原生支持 HTTP、HTTPS、FTP、SFTP、SCP、IMAP、POP3 等 20+ 协议,满足各类网络传输场景;
- 精细控制请求:可自定义请求头、Cookie、认证信息、HTTP 版本,甚至模拟浏览器行为;
- 双向数据传输:不仅能下载资源(如网页、文件),还能上传数据(如表单、JSON、文件);
- 脚本友好:无交互依赖,可嵌入 Shell 脚本实现自动化任务(如接口测试、定时数据同步)。
无论是简单的 “查看网页源码”,还是复杂的 “HTTPS 认证上传文件”,curl 都能通过简洁的参数组合实现,是 Linux 命令行生态中 “网络操作” 的核心工具。
一、基础准备:确认 curl 环境
Linux 系统(如 Ubuntu、CentOS)通常预装 curl,可通过以下命令验证:
# 查看 curl 版本,确认安装状态
curl --version
# 正确输出示例(Ubuntu):
# curl 7.81.0 (x86_64-pc-linux-gnu) libcurl/7.81.0 OpenSSL/3.0.2 zlib/1.2.11 brotli/1.0.9 zstd/1.4.8 libidn2/2.3.2 libpsl/0.21.0 (+libidn2/2.3.2) libssh/0.9.6/openssl/zlib nghttp2/1.43.0 librtmp/2.3 OpenLDAP/2.5.16
# Release-Date: 2022-01-05
# Protocols: dict file ftp ftps gopher gophers http https imap imaps ldap ldaps mqtt pop3 pop3s rtmp rtsp scp sftp smb smbs smtp smtps telnet tftp
# Features: alt-svc AsynchDNS brotli GSS-API HSTS HTTP2 HTTPS-proxy IDN IPv6 Kerberos Largefile libz NTLM NTLM_WB PSL SPNEGO SSL TLS-SRP UnixSockets zstd
若提示 “command not found”,需手动安装:
- Ubuntu/Debian:sudo apt update && sudo apt install -y curl
- CentOS/RHEL:sudo yum install -y curl
- Arch Linux:sudo pacman -S curl
二、核心用法:HTTP/HTTPS 基础请求
curl 最常用的场景是处理 HTTP/HTTPS 请求,以下按 “请求方法、数据处理、结果保存” 分类,覆盖日常高频操作。
2.1 GET 请求(默认方法)
curl 未指定请求方法时,默认使用 GET 方法,可直接获取 URL 对应的资源(如网页源码、接口响应)。
# 格式:curl <URL>
# 示例1:获取网页源码(直接输出到终端)
curl https://example.com
# 示例2:获取 JSON 接口响应(如查询 IP 信息)
curl https://httpbin.org/ip
# 输出示例:{"origin":"123.45.67.89"}
进阶:指定 HTTP 版本
部分场景需强制使用 HTTP/1.0 或 HTTP/1.1(默认可能用 HTTP/2),通过 -0(HTTP/1.0)或 -1(HTTP/1.1)参数实现:
# 用 HTTP/1.0 发送 GET 请求
curl -0 https://example.com
# 用 HTTP/1.1 发送 GET 请求
curl -1 https://example.com
# (扩展)强制使用 HTTP/2(需服务器支持)
curl --http2 https://example.com
2.2 POST 请求(提交数据)
POST 是提交数据的常用方法,curl 通过 -d(--data)参数指定提交的内容,默认发送 application/x-www-form-urlencoded 格式数据。
# 格式1:直接传递键值对(适合简单表单)
curl -d 'name=roger&age=18' -X POST https://httpbin.org/post
# 格式2:从本地文件读取数据(适合大量内容,如 JSON、长文本)
# 1. 先创建 data.txt,写入内容:name=roger&age=18
# 2. 读取文件提交
curl -d '@data.txt' -X POST https://httpbin.org/post
# 说明:
# -d 会自动将请求方法设为 POST,可省略 -X POST;
# 若需显式指定方法(如 PUT、DELETE),需加 -X <方法名>(见 2.4 节)。
特殊场景:POST 上传 JSON 数据
若接口要求接收 application/json 格式,需通过 -H(--header)参数设置请求头,明确指定 Content-Type:
# 格式:curl -d 'JSON字符串' -H 'Content-Type: application/json' <URL>
curl -d '{"name":"roger","age":18}' \
-H 'Content-Type: application/json' \
https://httpbin.org/post
# 换行符 \ 用于拆分长命令,提高可读性
2.3 GET 请求带参数(URL 编码)
GET 请求的参数通常拼接在 URL 后(如 https://xxx.com?name=roger&age=18),curl 可通过 -G(--get)参数自动将 -d 后的内容编码为 URL 参数,避免手动拼接特殊字符(如空格、&):
# 格式:curl -G -d '参数1' -d '参数2' <URL>
# 等价于:curl https://httpbin.org/get?name=roger&age=18
curl -G \
-d 'name=roger' \
-d 'age=18' \
https://httpbin.org/get
- -G 强制使用 GET 方法,并将 -d 的内容转为 URL 查询参数;
- 若参数含特殊字符(如空格),curl 会自动 URL 编码(如空格转为 %20)。
2.4 自定义请求方法(PUT/DELETE/PATCH)
除 GET/POST 外,RESTful 接口常使用 PUT(更新)、DELETE(删除)、PATCH(部分更新)等方法,curl 通过 -X(--request)参数指定:
# 1. PUT 方法(更新资源)
curl -d '{"age":19}' \
-H 'Content-Type: application/json' \
-X PUT https://httpbin.org/put
# 2. DELETE 方法(删除资源)
curl -X DELETE https://httpbin.org/delete
# 3. PATCH 方法(部分更新)
curl -d '{"age":20}' \
-H 'Content-Type: application/json' \
-X PATCH https://httpbin.org/patch
三、数据处理:下载与上传
curl 不仅能处理接口请求,还能完成 “文件下载”“文件上传” 等传输任务,支持断点续传、限速等功能。
3.1 下载文件(保存到本地)
场景 1:默认命名(与远程文件名一致)
通过 -O(大写 O,--remote-name)参数,将远程文件保存到当前目录,文件名与 URL 中的文件名保持一致:
# 格式:curl -O <远程文件URL>
# 示例:下载 Ubuntu 镜像,保存为“ubuntu-22.04.3-desktop-amd64.iso”
curl -O https://releases.ubuntu.com/22.04/ubuntu-22.04.3-desktop-amd64.iso
场景 2:自定义本地文件名
通过 -o(小写 o,--output)参数,指定本地保存路径和文件名(路径中的目录需提前创建):
# 格式:curl -o <本地路径/文件名> <远程文件URL>
# 示例1:保存到当前目录,重命名为“ubuntu.iso”
curl -o ubuntu.iso https://releases.ubuntu.com/22.04/ubuntu-22.04.3-desktop-amd64.iso
# 示例2:保存到指定目录(如 ~/downloads/)
curl -o ~/downloads/ubuntu.iso https://releases.ubuntu.com/22.04/ubuntu-22.04.3-desktop-amd64.iso
场景 3:断点续传(恢复中断下载)
若下载大文件时网络中断,通过 -C -(--continue-at -)参数可从上次中断位置继续下载,无需重新开始:
# 格式:curl -C - -O <远程文件URL>(或 -o 自定义路径)
# 示例:恢复之前中断的 Ubuntu 镜像下载
curl -C - -O https://releases.ubuntu.com/22.04/ubuntu-22.04.3-desktop-amd64.iso
- -C - 中的 - 表示 “自动识别中断位置”,curl 会先检查本地文件大小,再从对应位置请求剩余内容;
- 需确保本地已存在部分下载的文件,且文件名与远程一致(或通过 -o 指定相同路径)。
3.2 上传文件(表单 / 二进制)
场景 1:表单上传文件(multipart/form-data)
Web 表单上传文件通常使用 multipart/form-data 格式,curl 通过 -F(--form)参数模拟该行为,语法为 key=@本地文件路径;filename=自定义文件名(filename 可选,默认用本地文件名):
# 格式:curl -F '表单字段名=@本地文件路径' <上传接口URL>
# 示例:上传本地 photo.png,表单字段名为“file”,自定义远程文件名为“me.png”
curl -F 'file=@./photo.png;filename=me.png' https://httpbin.org/post
# 若无需自定义文件名,简化为:
curl -F 'file=@./photo.png' https://httpbin.org/post
场景 2:二进制上传(PUT 方法)
部分接口要求通过 PUT 方法直接上传二进制文件(如对象存储服务),可通过 --data-binary @本地文件 实现:
# 格式:curl --data-binary @本地文件 -X PUT <上传URL>
curl --data-binary @./data.txt -X PUT https://httpbin.org/put
3.3 限速传输(避免带宽占用过高)
下载或上传大文件时,为避免占用全部带宽影响其他服务,通过 --limit-rate 参数限制传输速度(单位:B/s、KB/s、MB/s):
# 格式:curl --limit-rate <速度> <URL>
# 示例1:下载限速 1MB/s
curl --limit-rate 1M -O https://releases.ubuntu.com/22.04/ubuntu-22.04.3-desktop-amd64.iso
# 示例2:上传限速 500KB/s
curl --limit-rate 500K -F 'file=@./large-file.zip' https://httpbin.org/post
- 速度单位:K(千字节)、M(兆字节),不写单位默认是字节(B/s);
- 该限制为 “最高速度”,实际速度受网络条件影响可能低于限制值。
四、请求控制:头信息、Cookie、认证
curl 支持精细控制请求的 “元信息”,包括请求头、Cookie、用户认证等,可模拟浏览器或客户端的真实请求行为。
4.1 自定义请求头(Header)
通过 -H(--header)参数添加或修改请求头,可多次使用 -H 添加多个头信息:
# 格式:curl -H '头信息1' -H '头信息2' <URL>
# 示例1:指定浏览器 User-Agent(模拟 Chrome 浏览器)
curl -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36' \
https://httpbin.org/user-agent
# 示例2:指定语言偏好(Accept-Language)和 Referer(来源页)
curl -H 'Accept-Language: en-US' \
-H 'Referer: https://example.com' \
https://httpbin.org/headers
- 常用请求头:User-Agent(客户端标识)、Referer(请求来源)、Content-Type(数据格式)、Authorization(认证信息)。
4.2 Cookie 处理(发送 / 保存)
Cookie 用于维持会话状态,curl 支持 “发送本地 Cookie” 和 “保存服务器返回的 Cookie”。
场景 1:发送 Cookie 到服务器
- 直接传递 Cookie 字符串:通过 -b(--cookie)参数,格式为 key1=value1;key2=value2;
- 发送本地 Cookie 文件:将 Cookie 保存到文件(如 cookies.txt),通过 -b 文件名 读取并发送。
# 1. 直接传递 Cookie 字符串
curl -b 'sessionid=abc123;username=roger' https://httpbin.org/cookies
# 2. 发送本地 Cookie 文件(假设 cookies.txt 已存在)
curl -b cookies.txt https://httpbin.org/cookies
场景 2:保存服务器返回的 Cookie 到本地
通过 -c(--cookie-jar)参数,将服务器响应的 Set-Cookie 头信息保存到指定文件:
# 格式:curl -c <保存Cookie的文件> <URL>
# 示例:访问网站,将 Cookie 保存到 cookies.txt
curl -c cookies.txt https://example.com
- 保存的文件格式为文本,可直接打开查看(如 #Netscape HTTP Cookie File 开头)。
4.3 用户认证(Basic/Digest/Bearer Token)
部分接口或网站需要用户认证才能访问,curl 支持多种认证方式:
场景 1:Basic 认证(用户名 + 密码)
最常见的认证方式,通过 -u(--user)参数传递 用户名:密码,curl 会自动将其编码为 Base64 格式的 Authorization 头:
# 格式:curl -u '用户名:密码' <认证URL>
# 示例:访问需要 Basic 认证的接口
curl -u 'admin:admin123' https://httpbin.org/basic-auth/admin/admin123
# 安全提示:若不想在命令行明文显示密码,可仅输入用户名,curl 会交互式提示输入密码:
curl -u 'admin' https://httpbin.org/basic-auth/admin/admin123
# 提示:Enter host password for user 'admin': (输入时无明文显示)
场景 2:Bearer Token 认证(JWT/OAuth2)
现代 API 常使用 Bearer Token(如 JWT)认证,需通过 -H 参数手动添加 Authorization: Bearer <token> 头:
# 格式:curl -H 'Authorization: Bearer <token>' <API URL>
curl -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...' \
https://api.example.com/user/profile
五、高级功能:SSL 忽略、重定向、调试
5.1 忽略 SSL 证书验证(测试场景)
访问 HTTPS 网站时,curl 会默认验证服务器 SSL 证书的有效性。若测试本地服务(如自签名证书),可通过 -k(--insecure)参数忽略证书验证:
# 格式:curl -k <HTTPS URL>
# 示例:访问本地自签名 HTTPS 服务
curl -k https://localhost:8443
警告:仅用于测试环境,生产环境禁用 -k,避免安全风险。
###5.2 跟随重定向(3xx 状态码)
当服务器返回 3xx 状态码(如 301 永久重定向、302 临时重定向)时,curl 默认不跟随跳转,通过 -L(--location)参数可自动跟随重定向,直到获取最终响应:
# 格式:curl -L <可能重定向的URL>
# 示例:访问会重定向的 URL(如 http://example.com 会重定向到 https://example.com)
curl -L http://example.com
5.3 调试请求(查看详细过程)
排查接口问题时,需查看 curl 与服务器的交互细节(如 DNS 解析、TCP 连接、请求 / 响应头),常用以下参数:
场景 1:显示详细请求过程(冗余模式)
通过 -v(--verbose)参数,输出从 “DNS 解析” 到 “响应接收” 的完整过程:
# 格式:curl -v <URL>
curl -v https://httpbin.org/ip
# 输出包含:
# 1. DNS 解析:* Trying 34.199.47.192:443...
# 2. TCP 连接:* Connected to httpbin.org (34.199.47.192) port 443 (#0)
# 3. SSL 握手:* ALPN, offering h2
# 4. 请求头:> GET /ip HTTP/2
# 5. 响应头:< HTTP/2 200
# 6. 响应内容:{"origin":"123.45.67.89"}
场景 2:仅查看响应头(不获取内容)
通过 -I(大写 I,--head)参数,仅发送 HEAD 请求,获取服务器返回的响应头(如状态码、Content-Type、Set-Cookie):
# 格式:curl -I <URL>
curl -I https://example.com
# 输出示例:
# HTTP/1.1 200 OK
# Age: 12345
# Cache-Control: max-age=604800
# Content-Type: text/html; charset=UTF-8
# Date: Thu, 05 Sep 2024 10:00:00 GMT
# Etag: "3147526947+ident"
# Expires: Thu, 12 Sep 2024 10:00:00 GMT
# Last-Modified: Thu, 17 Oct 2019 07:18:26 GMT
# Server: ECS (oxr/832E)
# Vary: Accept-Encoding
# X-Cache: HIT
# Content-Length: 1256
场景 3:跟踪完整数据传输(二进制级)
通过 --trace - 参数,以十六进制和 ASCII 格式输出 “发送 / 接收的所有数据”,适合排查复杂的协议问题:
# 格式:curl --trace - <URL>
curl --trace - https://httpbin.org/ip
5.4 代理访问(突破网络限制)
若本地网络无法直接访问目标 URL(如境外资源、内网服务),可通过 -x(--proxy)参数指定代理服务器,支持 HTTP、HTTPS、SOCKS5 等代理类型:
# 1. HTTP 代理(无认证)
curl -x http://代理IP:端口 https://httpbin.org/ip
# 2. HTTPS 代理(无认证)
curl -x https://代理IP:端口 https://httpbin.org/ip
# 3. SOCKS5 代理(无认证)
curl -x socks5://代理IP:端口 https://httpbin.org/ip
# 4. 带认证的代理(用户名:密码)
curl -x http://用户名:密码@代理IP:端口 https://httpbin.org/ip
六、常用参数速查表
为方便快速查阅,将 curl 高频参数按 “功能分类” 整理如下:
功能分类 | 参数 | 全称 | 核心作用 | 示例 |
---|---|---|---|---|
基础请求 | -X <method> | --request | 自定义请求方法(GET/POST/PUT/DELETE) | -X PUT |
-d <data> | --data | 提交数据(默认 POST 方法) | -d 'name=roger' | |
-G | --get | 将 -d 数据转为 GET 参数 | -G -d 'name=roger' | |
-H <header> | --header | 自定义请求头 | -H 'Content-Type: json' | |
文件传输 | -O | --remote-name | 下载文件,默认命名 | -O https://xxx.com/file.zip |
-o <path> | --output | 下载文件,自定义路径 / 文件名 | -o ~/file.zip https://xxx.com/file.zip | |
-C - | --continue-at | 断点续传 | -C - -O https://xxx.com/file.zip | |
-F <form> | --form | 表单上传文件(multipart/form-data) | -F 'file=@./photo.png' | |
--limit-rate <s> | --limit-rate | 限制传输速度(K/M) | --limit-rate 1M | |
Cookie 与认证 | -b <cookie> | --cookie | 发送 Cookie(字符串或文件) | -b 'sid=abc123' 或 -b cookies.txt |
-c <file> | --cookie-jar | 保存服务器 Cookie 到文件 | -c cookies.txt | |
-u <user:pass> | --user | Basic 认证(用户名:密码) | -u 'admin:123' | |
高级控制 | -k | --insecure | 忽略 SSL 证书验证 | -k https://localhost |
L | --location | 跟随重定向(3xx 状态码) | -L http://example.com | |
v | --verbose | 显示详细请求过程(调试用) | -v https://xxx.com | |
-I | --head | 仅获取响应头(HEAD 请求) | -I https://xxx.com | |
-x <proxy> | --proxy | 使用代理服务器(HTTP/HTTPS/SOCKS5) | -x socks5://127.0.0.1:1080 | |
输出控制 | -s | --silent | 静默模式(隐藏进度和错误) | -s https://xxx.com |
-S | --show-error | 与 -s 配合,仅显示错误信息 | -sS https://xxx.com |
总结
curl 是 Linux 命令行中 “功能最全面的网络工具”,其核心优势在于 “无交互依赖、可精细控制、支持多场景”。掌握它的关键在于:
- 区分参数大小写:如 -O(默认命名下载)和 -o(自定义命名)、-I(获取头)和 -i(头 + 内容);
- 按需组合参数:复杂场景需多个参数配合(如 “POST JSON + 自定义头 + 代理”:curl -d '{}' -H 'Content-Type: json' -x 代理 URL);
- 善用调试参数:遇到接口问题时,先用 -v 查看详细过程,或 -I 检查响应头,快速定位问题。
无论是日常的 “查看接口响应”,还是自动化脚本中的 “定时数据同步”,curl 都能成为高效的助力工具。