2025年12月

一、curl 是什么与如何安装

curl 是命令行网络工具,支持 HTTP/HTTPS、FTP/SFTP、SMTP 等协议,常用于测试接口、上传下载文件、走代理等。
安装
Debian/Ubuntu:sudo apt-get install curl
Fedora/RHEL/openEuler:sudo dnf install curl
CentOS 7:sudo yum install curl
macOS:系统自带;若需新特性(HTTP/3 等),可用 brew 安装:brew install curl
Windows 10+:通常内置 curl.exe;或使用 winget install curl / choco install curl
二、快速上手:最常用操作

GET 请求(默认)
curl https://api.example.com/users
包含响应头:curl -i https://api.example.com/users
保存到文件
指定文件名:curl -o out.json https://api.example.com/data
使用远端文件名:curl -O https://example.com/file.zip
依据 Content-Disposition 的文件名:curl -J -O https://example.com/download
跟随重定向
curl -L http://example.com
静默与错误
静默但显示错误:curl -sS https://example.com
HTTP 4xx/5xx 视为失败并返回非零码:curl -fsS https://example.com
三、HTTP 方法与请求体

GET 携带查询参数
curl -G 'https://api.example.com/search' -d 'q=test' -d 'page=2'
POST 发送 x-www-form-urlencoded
curl -X POST https://api.example.com/login -H 'Content-Type: application/x-www-form-urlencoded' -d 'user=alice&pass=secret'
自动 URL 编码某字段:curl -X POST https://api.example.com/search --data-urlencode 'q=中文 测试'
POST/PUT 发送 JSON
直接写:curl -X POST https://api.example.com/items -H 'Content-Type: application/json' -d '{"name":"Book","price":9.9}'
从文件:curl -X POST https://api.example.com/items -H 'Content-Type: application/json' --data-binary @data.json
新版简写(curl ≥ 7.82):curl --json '{"a":1}' https://api.example.com/endpoint
注意
使用 --data-binary 发送文件/JSON可避免换行或内容被修改;-d 更适合表单键值。
使用 -d/--data 时,curl 自动用 POST,无需额外 -X POST。
四、表单与文件上传

传统表单(application/x-www-form-urlencoded)
curl -X POST https://api.example.com/form -d 'a=1&b=2'
multipart/form-data(上传文件)
单文件:curl -X POST https://api.example.com/upload -F 'file=@/path/pic.jpg'
指定文件名与类型:curl -X POST https://api.example.com/upload -F 'file=@/path/report.pdf;filename=report.pdf;type=application/pdf'
同时带其他字段:curl -X POST https://api.example.com/upload -F 'file=@/path/a.txt' -F 'user=alice'
HTTP PUT 上传(服务器支持 PUT)
curl -X PUT https://api.example.com/object -H 'Content-Type: application/octet-stream' --data-binary @bin.dat
FTP/SFTP 上传(服务器需支持)
FTP:curl -T local.txt ftp://user:pass@host/path/remote.txt
SFTP:curl -T local.txt sftp://user@host/path/remote.txt
五、认证与安全

Basic 认证
curl -u user:pass https://api.example.com/secure
仅输入用户名(交互输入密码):curl -u user https://api.example.com/secure
Bearer Token/JWT
curl https://api.example.com/secure -H 'Authorization: Bearer YOUR_TOKEN'
Digest/NTLM(按服务端挑战自动切换或显式)
curl --digest -u user:pass https://example.com/digest
curl --ntlm -u user:pass https://example.com/ntlm
客户端证书(双向 TLS)
PEM:curl --cert client.crt --key client.key https://secure.example.com
P12:curl --cert client.p12:pass https://secure.example.com
TLS 验证与 CA
指定 CA:curl --cacert ca.pem https://example.com
跳过证书校验(不安全,仅调试):curl -k https://example.com
固定公钥(防中间人):curl --pinnedpubkey sha256//BASE64HASH https://example.com
指定 TLS 版本或 HTTP/2/3
HTTP/2:curl --http2 https://example.com
HTTP/3(需支持的构建与服务器):curl --http3 https://example.com
TLS 版本:curl --tlsv1.2 https://example.com
六、请求头与 cookies

自定义头
curl https://api.example.com -H 'Accept: application/json' -H 'X-Request-ID: 123'
Host 头(连接 IP 但请求域名)
简单:curl http://1.2.3.4 -H 'Host: api.example.com'
更可靠(覆盖 DNS):curl --resolve api.example.com:80:1.2.3.4 http://api.example.com
Cookies
发送 cookies:curl -b 'sid=abc123' https://example.com
从文件读取并保存:curl -b cookies.txt -c cookies.txt https://example.com
抓包后复用浏览器 cookie:导出为 Netscape 格式,curl -b cookies.txt
七、代理与网络

HTTP 代理
临时:curl --proxy http://proxy:8080 https://example.com
认证:curl --proxy http://proxy:8080 --proxy-user user:pass https://example.com
SOCKS 代理
curl --socks5 127.0.0.1:1080 https://example.com
环境变量
导出:http_proxy/https_proxy/socks_proxy/no_proxy
例:export https_proxy=http://proxy:8080
不走代理
curl --noproxy example.com https://example.com
八、下载技巧与性能控制

断点续传
curl -C - -O https://example.com/large.iso
只取部分(HTTP Range)
curl -r 0-999 -o head.bin https://example.com/file.bin
限速与超时
限速:curl --limit-rate 500k -O https://example.com/file
连接超时:curl --connect-timeout 5 https://example.com
总超时:curl -m 30 https://example.com
重试
curl --retry 5 --retry-connrefused --retry-all-errors https://example.com
最长重试时间:--retry-max-time 120
压缩传输
请求压缩并自动解压:curl --compressed https://example.com/data
九、调试与输出控制

查看响应头与详细过程
带响应头:curl -i https://example.com
详细日志:curl -v https://example.com
完整跟踪(含时间戳):curl --trace-time --trace out.trace https://example.com
状态码与结构化输出
仅状态码:curl -sS -o /dev/null -w '%{http_code}\n' https://example.com
常用指标:
curl -sS -o /dev/null -w 'code=%{http_code} time=%{time_total}s size=%{size_download}B\n' https://example.com
分离头与体
仅头保存:curl -D headers.txt -o /dev/null https://example.com
仅体保存:curl -s https://example.com -o body.bin
进度条与静默
进度条:curl --progress-bar -O https://example.com/file
静默但报错:curl -fsS https://example.com
十、批量与并行

多 URL 顺序处理
curl -O URL1 -O URL2 -O URL3
并行下载(curl ≥ 7.66)
curl --parallel --parallel-max 4 -O URL1 -O URL2 -O URL3 -O URL4
从列表文件读取
文件 urls.txt 每行一个 URL:xargs -n1 curl -O < urls.txt
或使用 curl 配置文件:curl -K curl.conf
十一、高级路由与主机解析

覆盖主机解析
curl --resolve api.example.com:443:203.0.113.10 https://api.example.com
改变连接目标但保留主机头
curl --connect-to api.example.com:443:alt.example.com:443 https://api.example.com
十二、配置文件与复用

用户级配置文件(~/.curlrc)
示例内容:
--compressed
--retry 3
--connect-timeout 5
--location
在命令中引入配置文件
curl -K mycurl.conf https://example.com
十三、常见陷阱与最佳实践

不依赖 -X 强制方法;使用 -d/--data/--data-binary/--form 让 curl 自动选择合适方法,必要时再 -X。
发送 JSON/二进制文件时使用 --data-binary 或 -F,避免内容被改动;显式声明 Content-Type。
不要把密码或 Token直接写入命令行(会留在历史和进程列表),改用交互、环境变量或文件:
TOKEN=((<token.txt);curl−H"Authorization:BearerTOKEN" …

避免使用 -k;在测试环境也建议提供正确 CA 或使用 --cacert。
结合 -fsS 使用,以便脚本正确处理错误返回码。
Windows 命令行引号规则与类 Unix 不同:
PowerShell 可用单引号:curl -d '{"a":1}' …
CMD 需转义双引号:curl -d "{"a":1}" …

十四、综合示例

调用 JSON API 并打印关键信息
curl -sS -o /dev/null -w 'code=%{http_code} time=%{time_total}s\n' -H 'Accept: application/json' https://api.example.com/items
上传文件并携带元数据
curl -X POST https://api.example.com/upload -F 'file=@/path/img.png' -F 'user=alice' -H 'Authorization: Bearer TOKEN'
通过 SOCKS5 代理访问并跟随重定向
curl --socks5 127.0.0.1:1080 -L https://example.com