curl 是 Linux 和类 Unix 系统里最强大的命令行工具之一,常被用来测试接口、下载文件、调试请求。几乎所有后端开发和运维都会用到它:"帮我 curl 一下这个接口"。但很多人只会 curl http://xxx,遇到带请求头、POST 数据、上传文件、cookie 会话就不知道怎么写了。这篇文章把 curl 的常用场景一次讲清,从入门到实战,让你真正用好 curl。
一、curl 是什么
curl(Client URL)是一个基于命令行的网络请求工具,支持 HTTP、HTTPS、FTP 等几十种协议。它和 wget 的区别:curl 更侧重接口调试和请求测试,wget 更侧重文件下载。做后端开发、调试接口,curl 是标配。
安装:
# Ubuntu / Debian
apt install -y curl
# CentOS / Rocky
yum install -y curl
二、基础用法
1. 发送 GET 请求
curl https://example.com
2. 显示详细响应头
curl -i https://example.com # 包含响应头
curl -I https://example.com # 只显示响应头
3. 静默输出并显示状态码(常用)
curl -s -o /dev/null -w "%{http_code}\n" https://example.com
# 输出 200,表示请求成功
-o /dev/null 丢弃响应体,-w 自定义输出格式,经常用来快速判断网站是否正常。
三、POST 请求与提交数据
1. 提交表单数据
curl -X POST https://example.com/login \
-d "username=admin&password=123456"
2. 提交 JSON 数据
curl -X POST https://example.com/api/user \
-H "Content-Type: application/json" \
-d '{"name":"zhangsan","age":25}'
3. 带请求头
curl https://api.example.com/user \
-H "Authorization: Bearer 你的Token" \
-H "Accept: application/json"
四、文件下载与上传
1. 下载文件
# 用 -o 指定保存文件名
curl -o file.zip https://example.com/file.zip
# 跟随重定向下载(很多下载链接会跳转)
curl -L -o file.zip https://example.com/download
# 断点续传
curl -C - -o file.zip https://example.com/file.zip
2. 模拟浏览器 User-Agent
有的网站会拦截 curl 的默认 UA:
curl -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" https://example.com
3. 上传文件
curl -X POST https://example.com/upload \
-F "file=@/path/to/photo.jpg" \
-F "note=封面图"
-F "file=@本地路径" 是 multipart 文件上传的标准写法。
五、cookie 会话
测试需要登录的接口时,需要携带 cookie:
# 先登录,把 cookie 存到文件
curl -c cookies.txt -X POST https://example.com/login -d "user=admin&pass=123"
# 之后的请求带上 cookie
curl -b cookies.txt https://example.com/private
-c 保存 cookie,-b 发送 cookie,这是模拟登录态的核心。
六、HTTPS 与证书
1. 跳过证书校验(测试时用,注意安全)
curl -k https://self-signed.example.com
2. 指定客户端证书
curl --cert client.pem --key client.key https://secure.example.com
七、复杂场景实战
场景一:批量检查多个网站是否正常
for url in $(cat urls.txt); do
code=$(curl -s -o /dev/null -w "%{http_code}" -L "$url")
echo "$url -> $code"
done
场景二:测接口接口响应时间
curl -o /dev/null -s -w "连接:%{time_connect}s\n首字节:%{time_starttransfer}s\n总耗时:%{time_total}s\n" https://example.com
场景三:配合 jq 解析返回的 JSON
curl -s https://api.example.com/user.json | jq '.data.name'
八、在服务器运维中的应用
服务器排障时,curl 是不可或缺的工具:
# 检查本地网站是否正常(绕过域名直达内网)
curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1:8080/
# 指定 Host 头测试虚拟主机
curl -H "Host: example.com" http://127.0.0.1/
# 指定 IP 访问(DNS 解析异常时排查)
curl --resolve example.com:443:1.2.3.4 https://example.com
配合 nginx 访问日志,用 curl 快速判断是网站自身问题还是网络/DNS 问题。
九、常见问题
Q1:提示 Could not resolve host?
DNS 解析失败,域名不存在或 DNS 没配好。检查网络和 /etc/resolv.conf。
Q2:提示 SSL certificate problem?
证书校验失败。若是自签证书可用 -k,生产环境请排查证书是否正确。
Q3:返回 403 Forbidden?
网站拒绝访问,可能是 UA 被拦、IP 被限、需要登录。加上 -A "Mozilla/5.0..." 或 cookie 试试。
Q4:下载到一半断了?
用 -C - 断点续传,或改用 wget(专门优化下载)。
总结
curl 核心就掌握几组参数:-X 指定方法、-d 提交数据、-H 加请求头、-o 保存文件、-F 上传文件、-c/-b 管理 cookie、-w 自定义输出。把这些记熟,调试接口、排障服务器、下载文件都不在话下。配合本站的 wget、Nginx 和运维系列教程,你就能成为命令行高手。
