Curl 全面使用指南
Curl(Client URL)是一个跨平台命令行工具,支持多种协议(HTTP/HTTPS/FTP/SFTP等),用于数据传输、API调试、文件上传/下载等场景。以下从 核心功能、用户疑问解答、高级技巧 三方面系统总结,并整合所有历史问题解答。
一、核心功能与基础用法
1. 基础命令结构
curl [选项] [URL]
2. 常用操作
功能 | 命令示例 |
---|---|
下载文件 | curl -O https://example.com/file.zip |
发送 GET 请求 | curl https://api.example.com/data |
发送 POST 请求 | curl -d "name=John" https://example.com |
上传文件 | curl -F "file=@photo.jpg" https://example.com/upload |
显示响应头 | curl -I https://example.com |
自动重定向 | curl -L https://example.com/short-url |
3. 关键选项
选项 | 说明 |
---|---|
-o <文件> | 保存输出到指定文件 |
-O | 使用服务器文件名保存文件 |
-d | 发送 POST 请求数据(默认表单编码) |
-F | 发送表单数据(支持文件上传) |
-H | 添加自定义请求头 |
-u | 用户名密码认证(Basic Auth) |
-L | 自动跟随重定向 |
-v | 显示详细请求过程(调试) |
-s | 静默模式(隐藏进度条) |
-S | 静默模式下仍显示错误信息 |
二、疑问解答汇总
1. curl -sSL
的作用是什么?
-s
:静默模式,隐藏非关键输出。-S
:在静默模式下仍显示错误信息。-L
:自动处理 HTTP 重定向(如 301/302)。- 典型场景:脚本中静默下载并确保获取最终资源。
curl -sSL https://get.docker.com | sh
2. multipart/form-data
与 x-www-form-urlencoded
的区别?
特性 | x-www-form-urlencoded | multipart/form-data |
---|---|---|
编码方式 | 键值对转义(如 key=value%20 ) | 分块传输(支持二进制) |
适用场景 | 纯文本表单提交 | 文件上传或混合数据 |
示例 | curl -d "name=John" | curl -F "file=@photo.jpg" |
3. -F "file=@photo.jpg"
中的 @
是必须的吗?
- 是:
@
表示读取文件内容发送,而非传递文件名字符串。# 正确:上传文件内容 curl -F "file=@photo.jpg" https://example.com# 错误:仅发送文件名(无 @ 符号) curl -F "file=photo.jpg" https://example.com
4. 常见 Content-Type
类型有哪些?
类型 | 用途 | 示例 |
---|---|---|
application/json | JSON 数据交互 | curl -H "Content-Type: application/json" |
multipart/form-data | 表单文件上传 | curl -F "file=@photo.jpg" |
application/x-www-form-urlencoded | 纯文本表单提交 | curl -d "key=value" |
5. curl -sS URL | jq '.key'
的作用?
- 流程:静默获取 JSON 数据 → 用
jq
提取字段。 - 示例:提取
results
数组第一个元素的name
字段。curl -sS https://api.example.com/data | jq '.results[0].name'
三、高级技巧与场景示例
1. 脚本自动化
- 静默下载并处理错误:
if curl -sSf -O https://example.com/file.zip; thenecho "下载成功!" elseecho "下载失败!" fi
2. 文件操作
- 断点续传:
curl -C - -O https://example.com/large_file.iso
3. 调试与网络控制
- 强制使用 IPv4/IPv6:
curl -4 https://example.com # IPv4 curl -6 https://example.com # IPv6
4. 结合 jq
处理 JSON
- 提取嵌套字段:
curl -sS https://api.example.com/data | jq '.user.profile.name'
四、注意事项与最佳实践
1. 安全性
- 敏感信息:避免命令行明文传递密码,改用环境变量:
curl -u $USER:$PASSWORD https://example.com
- SSL 验证:慎用
-k
(跳过证书验证),仅在测试环境使用。
2. 性能优化
- 限速下载:
curl --limit-rate 1M -O https://example.com/largefile.zip
- 超时控制:
curl --max-time 30 https://example.com # 30秒超时
3. 规范与兼容性
- 遵循
robots.txt
:控制爬取频率,避免被封禁。 - 兼容旧系统:使用
application/xml
或传统表单编码(如旧版 API)。
五、总结
Curl 是网络操作的“瑞士军刀”,其核心优势在于:
- 协议支持广泛:HTTP、FTP、SFTP 等。
- 灵活性强:通过组合选项适应复杂场景(如文件上传、认证、代理)。
- 脚本友好:静默模式、管道符与工具链(如
jq
)无缝协作。
关键使用原则:
- 明确数据格式:正确设置
Content-Type
(如 JSON、表单)。 - 安全优先:保护敏感信息,验证 SSL 证书。
- 高效调试:利用
-v
和-I
快速定位问题。
通过 man curl
或 curl --help
可探索更多高级功能(如客户端证书、SOCKS5 代理)。