当前位置: 首页 > news >正文

curl 命令完整使用手册

🌐 强大的命令行 HTTP 客户端 - 网络请求神器


目录

  1. 简介
  2. 安装
  3. 基础语法
  4. 基础操作
  5. HTTP 方法
  6. 请求头与认证
  7. Cookie 处理
  8. 数据提交
  9. 文件上传与下载
  10. SSL/TLS 与代理
  11. 调试与诊断
  12. 高级用法
  13. 实战示例
  14. 技巧与最佳实践

一、简介

1.1 什么是 curl

curl(Client URL)是一个强大的命令行工具,用于在各种协议下传输数据。它是开发者和系统管理员最常用的网络工具之一。

支持的协议:HTTP、HTTPS、FTP、FTPS、SCP、SFTP、SMTP、POP3、IMAP、LDAP、MQTT、RTSP、DICT、TELNET、FILE、GOPHER 等

核心特点

  • 支持 20+ 网络协议
  • 丰富的请求选项
  • 支持认证、代理、SSL
  • 跨平台
  • 可用于 API 测试、文件下载、调试等

1.2 工作原理

┌─────────────────────────────────────────────────────────────────────┐
│                    curl 工作流程                                    │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│    curl 命令                                                        │
│         │                                                           │
│         ▼                                                           │
│    ┌─────────────┐                                                 │
│    │  解析 URL   │                                                 │
│    └──────┬──────┘                                                 │
│           │                                                         │
│           ▼                                                         │
│    ┌─────────────┐                                                 │
│    │  DNS 解析   │                                                 │
│    └──────┬──────┘                                                 │
│           │                                                         │
│           ▼                                                         │
│    ┌─────────────┐                                                 │
│    │  TCP/TLS    │                                                 │
│    │  连接       │                                                 │
│    └──────┬──────┘                                                 │
│           │                                                         │
│           ▼                                                         │
│    ┌─────────────┐                                                 │
│    │  发送请求   │  ←── 方法、头、数据                              │
│    └──────┬──────┘                                                 │
│           │                                                         │
│           ▼                                                         │
│    ┌─────────────┐                                                 │
│    │  接收响应   │  ←── 状态码、头、数据                            │
│    └──────┬──────┘                                                 │
│           │                                                         │
│           ▼                                                         │
│    ┌─────────────┐                                                 │
│    │  输出结果   │  ←── stdout / 文件                               │
│    └─────────────┘                                                 │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

二、安装

2.1 各平台安装

Linux

# Debian/Ubuntu
sudo apt update
sudo apt install curl# CentOS/RHEL
sudo yum install curl# Alpine
apk add curl# Arch Linux
sudo pacman -S curl

macOS

# macOS 自带 curl
# 或通过 Homebrew 安装最新版
brew install curl

Windows

# Windows 10+ 自带 curl
curl --version# 或通过 Chocolatey
choco install curl# 或通过 Scoop
scoop install curl

2.2 验证安装

curl --version
# 输出: curl 8.4.0 (x86_64-pc-linux-gnu) ...# 测试请求
curl https://httpbin.org/get

三、基础语法

3.1 命令格式

curl [选项] [URL]# 基本请求
curl https://example.com# 带选项
curl -X POST -H "Content-Type: application/json" -d '{"key":"value"}' https://api.example.com

3.2 常用选项

请求控制

选项 说明 示例
-X METHOD 指定请求方法 curl -X POST url
-H "header" 添加请求头 curl -H "Accept: application/json" url
-d "data" 发送数据 curl -d "key=value" url
-F "field" 表单文件上传 curl -F "file=@photo.jpg" url
-G GET 方式发送数据 curl -G -d "key=value" url
--url-query 添加查询参数 curl --url-query "key=value" url

输出控制

选项 说明 示例
-o file 输出到文件 curl -o file.html url
-O 使用远程文件名保存 curl -O url/file.zip
-i 显示响应头+正文 curl -i url
-I 只显示响应头 curl -I url
-s 静默模式 curl -s url
-S 显示错误(配合 -s) curl -sS url
-v 详细输出 curl -v url
-w format 自定义输出格式 curl -w "%{http_code}" url
-# 进度条 curl -# -O url

连接控制

选项 说明 示例
--connect-timeout 连接超时(秒) curl --connect-timeout 10 url
-m N 总超时(秒) curl -m 30 url
--max-time N 总超时(同 -m) curl --max-time 30 url
--retry N 重试次数 curl --retry 3 url
--retry-delay N 重试间隔(秒) curl --retry-delay 5 --retry 3 url
-L 跟随重定向 curl -L url
--max-redirs N 最大重定向次数 curl --max-redirs 5 -L url
--compressed 请求压缩传输 curl --compressed url
-k 跳过 SSL 验证 curl -k https://self-signed.url
-N 禁用缓冲 curl -N url

认证

选项 说明 示例
-u user:pass 基本认证 curl -u admin:pass url
-T cert 客户端证书 curl --cert client.pem url
--key key 私钥文件 curl --key key.pem url
--cacert file CA 证书 curl --cacert ca.pem url

四、基础操作

4.1 发送 GET 请求

# 基本请求(默认 GET)
curl https://httpbin.org/get# 带查询参数
curl "https://httpbin.org/get?name=张三&age=25"# 使用 -G 和 -d 构造查询参数
curl -G -d "name=张三" -d "age=25" https://httpbin.org/get# URL 编码中文
curl -G --data-urlencode "name=张三" https://httpbin.org/get# 只获取响应头
curl -I https://httpbin.org/get# 获取头和正文
curl -i https://httpbin.org/get

4.2 保存响应

# 保存到文件(指定文件名)
curl -o page.html https://example.com# 使用远程文件名保存
curl -O https://example.com/file.zip# 保存多个文件
curl -O https://example.com/file1.zip -O https://example.com/file2.zip# 保存并显示进度
curl -# -O https://example.com/large-file.zip# 保存响应头到文件
curl -D headers.txt https://httpbin.org/get# 同时保存头和正文
curl -i https://httpbin.org/get -o response.txt# 追加到文件
curl -o log.txt --append https://httpbin.org/get

4.3 静默模式

# 不显示进度和错误
curl -s https://httpbin.org/get# 不显示进度但显示错误
curl -sS https://httpbin.org/get# 静默 + 输出到文件
curl -sS -o output.json https://httpbin.org/get# 在脚本中使用
response=$(curl -sS https://httpbin.org/get)
echo "$response"

4.4 跟随重定向

# 不跟随(默认)
curl http://httpbin.org/redirect/3
# 输出: 302 Found 重定向信息# 跟随重定向
curl -L http://httpbin.org/redirect/3# 限制重定向次数
curl -L --max-redirs 5 http://httpbin.org/redirect/10# 修改为 POST 重定向
curl -L --post301 -X POST -d "data" http://example.com

五、HTTP 方法

5.1 GET

# 基本 GET
curl https://httpbin.org/get# 带查询参数
curl "https://httpbin.org/get?key=value"# 带 Header
curl -H "Accept: application/json" https://httpbin.org/get# 带 Authorization
curl -H "Authorization: Bearer TOKEN" https://httpbin.org/get

5.2 POST

# POST 表单数据
curl -X POST -d "name=张三&age=25" https://httpbin.org/post# POST JSON 数据
curl -X POST -H "Content-Type: application/json" \-d '{"name":"张三","age":25}' \https://httpbin.org/post# POST 文件内容
curl -X POST -d @data.txt https://httpbin.org/post# POST JSON 文件
curl -X POST -H "Content-Type: application/json" \-d @data.json \https://httpbin.org/post# POST 二进制数据
curl -X POST --data-binary @image.png https://httpbin.org/post# POST multipart 表单
curl -X POST -F "name=张三" -F "age=25" https://httpbin.org/post

5.3 PUT

# PUT JSON
curl -X PUT -H "Content-Type: application/json" \-d '{"name":"李四","age":30}' \https://httpbin.org/put# PUT 文件
curl -X PUT -T file.txt https://httpbin.org/put

5.4 PATCH

curl -X PATCH -H "Content-Type: application/json" \-d '{"age":31}' \https://httpbin.org/patch

5.5 DELETE

curl -X DELETE https://httpbin.org/delete# 带 body
curl -X DELETE -H "Content-Type: application/json" \-d '{"reason":"cleanup"}' \https://httpbin.org/delete

5.6 HEAD

# 只获取响应头
curl -I https://httpbin.org/get# 等价于
curl --head https://httpbin.org/get# 检查资源是否存在
curl -I -s -o /dev/null -w "%{http_code}" https://httpbin.org/get
# 输出: 200

5.7 OPTIONS

curl -X OPTIONS -i https://httpbin.org/get# 查看支持的 CORS 头
curl -X OPTIONS \-H "Origin: http://example.com" \-H "Access-Control-Request-Method: POST" \-i https://httpbin.org/get

六、请求头与认证

6.1 自定义请求头

# 添加单个头
curl -H "Accept: application/json" https://httpbin.org/get# 添加多个头
curl \-H "Accept: application/json" \-H "Content-Type: application/json" \-H "X-Custom-Header: value" \https://httpbin.org/get# User-Agent
curl -H "User-Agent: MyApp/1.0" https://httpbin.org/get
# 或使用 -A
curl -A "MyApp/1.0" https://httpbin.org/get# Referer
curl -H "Referer: https://example.com" https://httpbin.org/get
# 或使用 -e
curl -e "https://example.com" https://httpbin.org/get# 从文件读取请求头
curl -H @headers.txt https://httpbin.org/get

6.2 HTTP 基本认证

# 基本认证
curl -u username:password https://httpbin.org/basic-auth/username/password# 只输用户名(会提示输入密码)
curl -u username https://httpbin.org/basic-auth/username/password# 使用 token
curl -H "Authorization: Bearer your-token-here" https://api.example.com# AWS 签名认证(v4)
curl --aws-sigv4 "aws:amz:us-east-1:service" \-u "ACCESS_KEY:SECRET_KEY" \https://service.amazonaws.com/api

6.3 OAuth 认证

# OAuth Bearer Token
curl -H "Authorization: Bearer ACCESS_TOKEN" \https://api.example.com/user# OAuth 2.0 获取 Token
curl -X POST \-d "grant_type=client_credentials" \-d "client_id=YOUR_ID" \-d "client_secret=YOUR_SECRET" \https://auth.example.com/oauth/token# OAuth 2.0 授权码
curl -X POST \-d "grant_type=authorization_code" \-d "code=AUTH_CODE" \-d "redirect_uri=https://example.com/callback" \-d "client_id=YOUR_ID" \-d "client_secret=YOUR_SECRET" \https://auth.example.com/oauth/token# OAuth 2.0 刷新 Token
curl -X POST \-d "grant_type=refresh_token" \-d "refresh_token=REFRESH_TOKEN" \-d "client_id=YOUR_ID" \-d "client_secret=YOUR_SECRET" \https://auth.example.com/oauth/token

6.4 API Key 认证

# Header 方式
curl -H "X-API-Key: your-api-key" https://api.example.com/data# Query 参数方式
curl "https://api.example.com/data?api_key=your-api-key"

七、Cookie 处理

# 发送单个 Cookie
curl -b "name=value" https://httpbin.org/cookies# 发送多个 Cookie
curl -b "name1=value1;name2=value2" https://httpbin.org/cookies# 从文件读取 Cookie
curl -b cookies.txt https://httpbin.org/cookies# 使用 Netscape 格式
curl -b "cookies.txt" https://example.com
# 保存响应的 Cookie 到文件
curl -c cookies.txt https://httpbin.org/cookies/set?name=value# 同时发送和保存
curl -b cookies.txt -c cookies.txt https://example.com/login# 登录后保持会话
curl -c cookies.txt -d "user=admin&pass=123456" https://example.com/login
# 使用保存的 Cookie 访问
curl -b cookies.txt https://example.com/dashboard# 使用 Cookie Jar
curl -j -c cookies.txt -b cookies.txt https://example.com
# Netscape Cookie 文件格式
#Domain  Flag  Path  Secure  Expiry  Name  Value
.example.com  TRUE  /  FALSE  0  session  abc123
.api.example.com  TRUE  /  TRUE  1735689600  token  xyz789

八、数据提交

8.1 表单数据 (application/x-www-form-urlencoded)

# 基本表单
curl -d "username=admin&password=123456" https://httpbin.org/post# 等价于 -X POST -d
curl -X POST -d "username=admin&password=123456" https://httpbin.org/post# 自动 URL 编码
curl --data-urlencode "name=张三" --data-urlencode "city=北京" \https://httpbin.org/post# 从文件读取
curl -d @formdata.txt https://httpbin.org/post

8.2 JSON 数据

# 发送 JSON
curl -H "Content-Type: application/json" \-d '{"name":"张三","age":25,"city":"北京"}' \https://httpbin.org/post# 从文件读取 JSON
curl -H "Content-Type: application/json" \-d @data.json \https://httpbin.org/post# 使用 heredoc 发送多行 JSON
curl -X POST \-H "Content-Type: application/json" \-d @- \https://httpbin.org/post <<EOF
{"name": "张三","age": 25,"hobbies": ["编程", "阅读"]
}
EOF# 动态构造 JSON(使用变量)
NAME="张三"
AGE=25
curl -H "Content-Type: application/json" \-d "{\"name\":\"$NAME\",\"age\":$AGE}" \https://httpbin.org/post# 使用 jq 构造 JSON
curl -H "Content-Type: application/json" \-d "$(jq -n --arg name "张三" --argjson age 25 '{name:$name,age:$age}')" \https://httpbin.org/post

8.3 Multipart 表单 (multipart/form-data)

# 上传文件
curl -F "file=@photo.jpg" https://httpbin.org/post# 指定文件类型
curl -F "file=@photo.jpg;type=image/jpeg" https://httpbin.org/post# 指定文件名
curl -F "file=@/tmp/upload.jpg;filename=avatar.jpg" https://httpbin.org/post# 混合字段和文件
curl -F "name=张三" -F "age=25" -F "photo=@photo.jpg" \https://httpbin.org/post# 上传多个文件
curl -F "files=@file1.txt" -F "files=@file2.txt" \https://httpbin.org/post# 上传二进制文件
curl -F "file=@data.bin;type=application/octet-stream" \https://httpbin.org/post

8.4 XML/SOAP 数据

# 发送 XML
curl -H "Content-Type: application/xml" \-d '<?xml version="1.0"?><user><name>张三</name></user>' \https://httpbin.org/post# SOAP 请求
curl -H "Content-Type: text/xml" \-H "SOAPAction: http://example.com/action" \-d '<?xml version="1.0"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"><soap:Body><GetUser><UserId>123</UserId></GetUser></soap:Body>
</soap:Envelope>' \https://example.com/soap

8.5 GraphQL

# GraphQL 查询
curl -X POST \-H "Content-Type: application/json" \-d '{"query":"{ user(id: 1) { name email } }"}' \https://api.example.com/graphql# GraphQL 变量
curl -X POST \-H "Content-Type: application/json" \-d '{"query":"query($id:Int!){user(id:$id){name email}}","variables":{"id":1}}' \https://api.example.com/graphql# 从文件读取查询
curl -X POST \-H "Content-Type: application/json" \-d @query.json \https://api.example.com/graphql

九、文件上传与下载

9.1 下载文件

# 基本下载
curl -O https://example.com/file.zip# 指定文件名下载
curl -o myfile.zip https://example.com/file.zip# 下载并显示进度条
curl -# -O https://example.com/large-file.zip# 断点续传
curl -C - -O https://example.com/large-file.zip# 限速下载
curl --limit-rate 1M -O https://example.com/large-file.zip# 下载并校验
curl -O https://example.com/file.zip
sha256sum file.zip# 批量下载
for i in {1..10}; docurl -O "https://example.com/file_${i}.zip"
done# 下载列表
while read url; docurl -O "$url"
done < urls.txt# 下载到指定目录
curl -o /tmp/download/file.zip https://example.com/file.zip

9.2 上传文件

# 上传单个文件
curl -F "file=@localfile.txt" https://example.com/upload# 上传并指定文件名
curl -F "file=@localfile.txt;filename=renamed.txt" https://example.com/upload# 上传多个文件
curl -F "file1=@a.txt" -F "file2=@b.txt" https://example.com/upload# PUT 上传
curl -T localfile.txt https://example.com/upload/file.txt# 上传大文件(带进度)
curl -# -F "file=@large-file.zip" https://example.com/upload# SFTP 上传
curl -T localfile.txt sftp://example.com/upload/ --user user:pass# SCP 上传
curl -T localfile.txt scp://example.com/upload/ --user user:pass

9.3 FTP 操作

# 下载 FTP 文件
curl -u user:pass ftp://ftp.example.com/file.txt -o file.txt# 上传 FTP 文件
curl -T localfile.txt -u user:pass ftp://ftp.example.com/upload/# 列出 FTP 目录
curl -u user:pass ftp://ftp.example.com/# 创建 FTP 目录
curl -u user:pass -Q "MKD /newdir" ftp://ftp.example.com/# 删除 FTP 文件
curl -u user:pass -Q "DELE /file.txt" ftp://ftp.example.com/# FTPS(FTP over SSL)
curl -u user:pass ftps://ftp.example.com/file.txt -o file.txt

十、SSL/TLS 与代理

10.1 SSL/TLS 选项

# 跳过 SSL 验证(不安全)
curl -k https://self-signed.example.com# 指定 CA 证书
curl --cacert /path/to/ca.pem https://example.com# 指定证书目录
curl --capath /etc/ssl/certs/ https://example.com# 客户端证书认证
curl --cert client.pem --key key.pem https://example.com# 带密码的证书
curl --cert client.pem:password --key key.pem https://example.com# 指定 TLS 版本
curl --tlsv1.2 https://example.com
curl --tlsv1.3 https://example.com
curl --tls-max 1.2 https://example.com# 查看证书信息
curl -v https://example.com 2>&1 | grep -E "SSL|subject|issuer"# 指定密码套件
curl --ciphers ECDHE-ECDSA-AES256-GCM-SHA384 https://example.com# PEM 格式证书链
curl --cert-type PEM --cert client.pem https://example.com

10.2 代理设置

# HTTP 代理
curl -x http://proxy:8080 https://example.com
curl --proxy http://proxy:8080 https://example.com# 带认证的代理
curl -x http://user:pass@proxy:8080 https://example.com# SOCKS5 代理
curl -x socks5://proxy:1080 https://example.com# SOCKS5h(DNS 也通过代理解析)
curl -x socks5h://proxy:1080 https://example.com# SOCKS4 代理
curl -x socks4://proxy:1080 https://example.com# HTTPS 代理
curl -x https://proxy:443 https://example.com# 从环境变量读取代理
export http_proxy=http://proxy:8080
export https_proxy=http://proxy:8080
curl https://example.com# 不使用代理
curl --noproxy "*" https://example.com
curl --noproxy "localhost,192.168.*" https://example.com# 代理自动配置 (PAC)
curl --proxy-pac file://proxy.pac https://example.com# 通过 SSH 隧道
# 先建立隧道
ssh -D 1080 user@remote-host -f -N
# 然后使用 SOCKS 代理
curl -x socks5h://localhost:1080 https://example.com

10.3 使用 .netrc 文件

# 创建 ~/.netrc 文件
cat > ~/.netrc << EOF
machine api.example.comlogin usernamepassword secret123machine ftp.example.comlogin ftpuserpassword ftppass
EOFchmod 600 ~/.netrc# 使用 .netrc 认证
curl -n https://api.example.com/data
# 或
curl --netrc https://api.example.com/data# 指定 .netrc 文件
curl --netrc-file /path/to/.netrc https://api.example.com/data

十一、调试与诊断

11.1 详细输出 (-v)

# 显示完整请求和响应过程
curl -v https://httpbin.org/get# 输出示例:
# *   Trying 54.166.163.67:443...
# * Connected to httpbin.org (54.166.163.67) port 443
# * TLSv1.3 (OUT), TLS handshake, Client hello
# * TLSv1.3 (IN), TLS handshake, Server hello
# > GET /get HTTP/2
# > Host: httpbin.org
# > User-Agent: curl/8.4.0
# > Accept: */*
# >
# < HTTP/2 200
# < date: Mon, 01 Jan 2024 00:00:00 GMT
# < content-type: application/json
# < content-length: 300
# <
# {"args":{},"headers":{...}}# 只看请求头
curl -v https://httpbin.org/get 2>&1 | grep "^>"# 只看响应头
curl -v https://httpbin.org/get 2>&1 | grep "^<"# 只看 SSL 信息
curl -v https://httpbin.org/get 2>&1 | grep -i "SSL\|TLS\|certificate"

11.2 自定义输出格式 (-w)

# 只获取 HTTP 状态码
curl -s -o /dev/null -w "%{http_code}" https://httpbin.org/get
# 输出: 200# 获取响应时间
curl -s -o /dev/null -w "Time: %{time_total}s\n" https://httpbin.org/get# 获取详细信息
curl -s -o /dev/null -w "\
HTTP Code: %{http_code}\n\
DNS Time: %{time_namelookup}s\n\
Connect Time: %{time_connect}s\n\
TLS Time: %{time_appconnect}s\n\
Start Transfer: %{time_starttransfer}s\n\
Total Time: %{time_total}s\n\
Download Size: %{size_download} bytes\n\
Speed: %{speed_download} bytes/s\n\
" https://httpbin.org/get# JSON 格式输出
curl -s -o /dev/null -w '{"code":%{http_code},"time":%{time_total},"size":%{size_download}}' \https://httpbin.org/get# 获取重定向 URL
curl -s -o /dev/null -w "%{redirect_url}" http://httpbin.org/redirect/1# 获取远程 IP
curl -s -o /dev/null -w "%{remote_ip}" https://httpbin.org/get

可用变量

变量 说明
%{http_code} HTTP 状态码
%{http_version} HTTP 版本
%{time_total} 总耗时(秒)
%{time_namelookup} DNS 解析时间
%{time_connect} TCP 连接时间
%{time_appconnect} TLS 握手时间
%{time_starttransfer} 开始传输时间
%{time_redirect} 重定向时间
%{size_download} 下载字节数
%{size_upload} 上传字节数
%{speed_download} 下载速度
%{speed_upload} 上传速度
%{remote_ip} 远程 IP
%{remote_port} 远程端口
%{url_effective} 最终 URL
%{redirect_url} 重定向 URL
%{ssl_verify_result} SSL 验证结果
%{content_type} Content-Type

11.3 超时与重试

# 连接超时 10 秒
curl --connect-timeout 10 https://example.com# 总超时 30 秒
curl -m 30 https://example.com# 重试 3 次
curl --retry 3 https://example.com# 重试间隔 5 秒
curl --retry 3 --retry-delay 5 https://example.com# 只在特定错误时重试
curl --retry 3 --retry-all-errors https://example.com# 连接失败时重试
curl --retry 3 --retry-connrefused https://example.com# 组合使用
curl --connect-timeout 10 -m 60 --retry 3 --retry-delay 5 https://example.com

11.4 输出到文件

# 保存详细日志
curl -v https://httpbin.org/get 2>debug.log# 保存响应头
curl -D headers.txt https://httpbin.org/get# 保存完整请求/响应
curl -v https://httpbin.org/get > response.txt 2>&1# 分别保存头和正文
curl -D headers.txt -o body.json https://httpbin.org/get# 追加到日志文件
curl -v https://httpbin.org/get 2>> debug.log

十二、高级用法

12.1 并发请求

# 使用 xargs 并发
cat urls.txt | xargs -n 1 -P 10 curl -s -O# 使用 GNU parallel
cat urls.txt | parallel -j 10 curl -s -O {}# 批量测试 API
for i in {1..100}; docurl -s -o /dev/null -w "%{http_code} %{time_total}s\n" \https://httpbin.org/get?id=$i &
done
wait# 使用 curl 的 --next 处理多个请求
curl -s https://httpbin.org/get --next https://httpbin.org/post -X POST -d "data"

12.2 条件请求

# If-Modified-Since
curl -H "If-Modified-Since: Wed, 01 Jan 2024 00:00:00 GMT" \https://httpbin.org/get# If-None-Match (ETag)
curl -H 'If-None-Match: "abc123"' https://httpbin.org/get# 检查文件是否修改
response=$(curl -s -o /dev/null -w "%{http_code}" \-H "If-Modified-Since: Wed, 01 Jan 2024 00:00:00 GMT" \https://example.com/api)
if [ "$response" = "304" ]; thenecho "未修改"
elif [ "$response" = "200" ]; thenecho "已修改"
fi

12.3 范围请求

# 下载文件的一部分
curl -r 0-1023 https://example.com/file.zip -o part1.bin# 下载后半部分
curl -r 1024- https://example.com/file.zip -o part2.bin# 下载最后 1024 字节
curl -r -1024 https://example.com/file.zip -o end.bin# 分块下载
for i in {0..9}; dostart=$((i * 1000000))end=$((start + 999999))curl -r $start-$end https://example.com/large-file.zip -o "part_$i" &
done
wait
cat part_* > large-file.zip

12.4 连接复用

# 使用 --keepalive
curl --keepalive-time 60 https://example.com/api/1 --next https://example.com/api/2# HTTP/2 多路复用
curl --http2 https://example.com# 强制 HTTP/2
curl --http2-prior-knowledge https://example.com# 使用 Unix Socket
curl --unix-socket /var/run/docker.sock http://localhost/containers/json

12.5 配置文件

# 创建 ~/.curlrc 配置文件
cat > ~/.curlrc << EOF
# 默认选项
--connect-timeout 10
--max-time 60
--compressed
--location
--silent --show-error
--fail# 默认请求头
--header "Accept: application/json"
--header "User-Agent: MyApp/1.0"
EOF# 使用 -K 指定配置文件
curl -K ~/.curlrc https://example.com# 在配置文件中设置变量
cat > curl-config.txt << EOF
--url "https://api.example.com"
--header "Authorization: Bearer TOKEN"
--header "Content-Type: application/json"
--data @request.json
EOF
curl -K curl-config.txt

12.6 URL 处理

# URL 编码
curl --data-urlencode "name=张 三" https://httpbin.org/post# 全局 URL 编码
curl --data-urlencode "name=张三" --data-urlencode "desc=Hello World" \https://httpbin.org/post# 处理特殊字符
curl "https://example.com/search?q=$(python3 -c 'import urllib.parse; print(urllib.parse.quote("张三"))')"# 解析 URL
curl --url-query "name=张三" --url-query "age=25" https://httpbin.org/get

十三、实战示例

13.1 REST API 测试

CRUD 操作

# CREATE - 创建资源
curl -X POST \-H "Content-Type: application/json" \-H "Authorization: Bearer TOKEN" \-d '{"name":"张三","email":"zhangsan@example.com"}' \https://api.example.com/users# READ - 获取资源
curl -H "Authorization: Bearer TOKEN" \https://api.example.com/users/1# 获取列表
curl -H "Authorization: Bearer TOKEN" \"https://api.example.com/users?page=1&limit=10"# UPDATE - 更新资源
curl -X PUT \-H "Content-Type: application/json" \-H "Authorization: Bearer TOKEN" \-d '{"name":"李四","email":"lisi@example.com"}' \https://api.example.com/users/1# 部分更新
curl -X PATCH \-H "Content-Type: application/json" \-H "Authorization: Bearer TOKEN" \-d '{"name":"李四"}' \https://api.example.com/users/1# DELETE - 删除资源
curl -X DELETE \-H "Authorization: Bearer TOKEN" \https://api.example.com/users/1

GitHub API

# 获取仓库信息
curl https://api.github.com/repos/torvalds/linux# 获取用户信息
curl https://api.github.com/users/torvalds# 创建 Issue(需要 Token)
curl -X POST \-H "Authorization: token GITHUB_TOKEN" \-H "Content-Type: application/json" \-d '{"title":"Bug report","body":"Description"}' \https://api.github.com/repos/owner/repo/issues# 搜索仓库
curl "https://api.github.com/search/repositories?q=language:python&sort=stars&per_page=10"# 获取 README
curl -H "Accept: application/vnd.github.raw" \https://api.github.com/repos/torvalds/linux/readme

Docker API

# 列出容器(通过 Unix Socket)
curl --unix-socket /var/run/docker.sock http://localhost/containers/json# 拉取镜像
curl --unix-socket /var/run/docker.sock \-X POST "http://localhost/images/create?fromImage=nginx:latest"# 查看镜像
curl --unix-socket /var/run/docker.sock http://localhost/images/json# 创建容器
curl --unix-socket /var/run/docker.sock \-X POST -H "Content-Type: application/json" \-d '{"Image":"nginx:latest","HostConfig":{"PortBindings":{"80/tcp":[{"HostPort":"8080"}]}}}' \http://localhost/containers/create

13.2 文件下载脚本

#!/bin/bash
# download.sh - 智能下载脚本URL="$1"
FILENAME="${2:-$(basename "$URL")}"# 带重试和续传的下载
curl -L -C - --retry 3 --retry-delay 5 \--connect-timeout 10 --max-time 300 \-# -o "$FILENAME" "$URL"if [ $? -eq 0 ]; thenecho "✅ 下载完成: $FILENAME"
elseecho "❌ 下载失败"exit 1
fi

13.3 网站健康检查

#!/bin/bash
# health_check.sh - 网站健康检查check_url() {local url=$1local start=$(date +%s%N)response=$(curl -s -o /dev/null -w "%{http_code}|%{time_total}" \--connect-timeout 5 --max-time 10 "$url")local end=$(date +%s%N)local code=$(echo "$response" | cut -d'|' -f1)local time=$(echo "$response" | cut -d'|' -f2)if [ "$code" = "200" ]; thenecho "✅ $url - 状态码: $code - 耗时: ${time}s"elseecho "❌ $url - 状态码: $code - 耗时: ${time}s"fi
}# 检查多个 URL
check_url "https://www.google.com"
check_url "https://www.github.com"
check_url "https://www.cloudflare.com"

13.4 API 性能测试

#!/bin/bash
# bench.sh - 简单 API 性能测试URL="https://httpbin.org/get"
REQUESTS=100echo "开始测试: $URL"
echo "请求数: $REQUESTS"
echo "---"total_time=0
success=0
fail=0for i in $(seq 1 $REQUESTS); doresult=$(curl -s -o /dev/null -w "%{http_code}|%{time_total}" \--connect-timeout 5 --max-time 10 "$URL")code=$(echo "$result" | cut -d'|' -f1)time=$(echo "$result" | cut -d'|' -f2)if [ "$code" = "200" ]; thensuccess=$((success + 1))elsefail=$((fail + 1))fitotal_time=$(echo "$total_time + $time" | bc)printf "\r进度: %d/%d" $i $REQUESTS
doneecho ""
echo "---"
echo "✅ 成功: $success"
echo "❌ 失败: $fail"
echo "⏱️ 总耗时: ${total_time}s"
avg=$(echo "scale=3; $total_time / $REQUESTS" | bc)
echo "📊 平均耗时: ${avg}s"
qps=$(echo "scale=1; $REQUESTS / $total_time" | bc)
echo "🚀 QPS: $qps"

13.5 发送邮件 (SMTP)

# 发送简单邮件
curl --url "smtp://smtp.example.com:587" \--ssl-reqd \--mail-from "sender@example.com" \--mail-rcpt "receiver@example.com" \-u "sender@example.com:password" \-T email.txt# email.txt 内容
cat > email.txt << EOF
From: sender@example.com
To: receiver@example.com
Subject: Test EmailHello, this is a test email.
EOF

13.6 IP 和 DNS 查询

# 获取公网 IP
curl -s https://api.ipify.org
curl -s https://ifconfig.me
curl -s https://icanhazip.com
curl -s https://checkip.amazonaws.com# 获取 IP 详细信息
curl -s https://ipinfo.io/8.8.8.8 | jq# DNS 查询 (通过 DNS-over-HTTPS)
curl -s "https://dns.google/resolve?name=example.com&type=A" | jq# Cloudflare DNS
curl -s "https://cloudflare-dns.com/dns-query?name=example.com&type=A" \-H "Accept: application/dns-json" | jq

13.7 天气查询

# 获取天气 (wttr.in)
curl -s "wttr.in/Beijing?format=3"
# 输出: Beijing: ☀️ +25°Ccurl -s "wttr.in/Beijing?lang=zh"# JSON 格式
curl -s "wttr.in/Beijing?format=j1" | jq '.current_condition[0] | {temp_C, weatherDesc, humidity}'

十四、技巧与最佳实践

14.1 实用别名

# 添加到 ~/.bashrc 或 ~/.zshrc# 获取 HTTP 状态码
alias httpcode='curl -s -o /dev/null -w "%{http_code}\n"'# 获取响应时间
alias httptime='curl -s -o /dev/null -w "Total: %{time_total}s\nConnect: %{time_connect}s\n"'# JSON 格式化
alias curljson='curl -s -H "Accept: application/json" | jq .'# 静默请求
alias curls='curl -sS'# 下载带进度
alias curldl='curl -# -O -L -C -'# 查看公网 IP
alias myip='curl -s https://ifconfig.me'# 天气
alias weather='curl -s "wttr.in?lang=zh&format=3"'

14.2 常见陷阱

陷阱 1:& 符号被 shell 解释

# 错误
curl "https://example.com/api?a=1&b=2"  # & 会被 shell 解释# 正确:使用引号
curl "https://example.com/api?a=1&b=2"# 或使用 -G -d
curl -G -d "a=1" -d "b=2" https://example.com/api

陷阱 2:JSON 中的引号

# 错误
curl -d '{"key":"value"}' url  # 单引号内不能嵌入变量# 正确:使用转义
curl -d "{\"key\":\"$value\"}" url# 或使用文件
echo "{\"key\":\"$value\"}" > data.json
curl -d @data.json url# 或使用 jq 构造
curl -d "$(jq -n --arg v "$value" '{key:$v}')" url

陷阱 3:大文件下载中断

# 使用断点续传
curl -C - -O https://example.com/large-file.zip# 带重试
curl -C - --retry 3 --retry-delay 5 -O https://example.com/large-file.zip

陷阱 4:二进制数据损坏

# 错误:-d 会处理特殊字符
curl -d @binary-file url# 正确:使用 --data-binary
curl --data-binary @binary-file url

陷阱 5:响应被截断

# 使用 -sS 而不是 -s
curl -sS url  # 显示错误信息# 设置超时
curl -m 60 url  # 总超时 60 秒

14.3 安全建议

# 1. 不要在命令行暴露密码
# 错误
curl -u admin:password123 url# 正确:使用环境变量
curl -u admin:$API_PASSWORD url# 或使用 .netrc
curl -n url# 2. 使用 HTTPS
curl https://example.com  # 而不是 http://# 3. 验证 SSL 证书
curl --cacert /path/to/ca.pem https://example.com# 4. 不要跳过 SSL 验证(生产环境)
# 避免:curl -k https://example.com# 5. 使用配置文件存储敏感信息
cat > ~/.curlrc << EOF
--header "Authorization: Bearer $TOKEN"
EOF
chmod 600 ~/.curlrc

14.4 性能建议

# 1. 启用压缩
curl --compressed url# 2. 复用连接
curl --keepalive-time 60 url1 --next url2# 3. 使用 HTTP/2
curl --http2 url# 4. 限制输出(调试时)
curl -s -o /dev/null -w "%{http_code}" url# 5. 使用 DNS 缓存
curl --resolve example.com:443:1.2.3.4 https://example.com

14.5 调试模板

# 完整调试脚本
debug_curl() {local url=$1echo "=== 请求信息 ==="curl -v -sS "$url" 2>&1 | head -30echo ""echo "=== 响应统计 ==="curl -s -o /dev/null -w "\
状态码: %{http_code}
HTTP 版本: %{http_version}
DNS 解析: %{time_namelookup}s
TCP 连接: %{time_connect}s
TLS 握手: %{time_appconnect}s
开始传输: %{time_starttransfer}s
总耗时: %{time_total}s
下载大小: %{size_download} bytes
下载速度: %{speed_download} bytes/s
远程 IP: %{remote_ip}:%{remote_port}
" "$url"
}

附录

A. 选项速查表

请求选项

选项 说明
-X METHOD HTTP 方法
-H "header" 请求头
-d "data" POST 数据
-F "field" 表单数据
-G GET 参数
-b "cookie" 发送 Cookie
-c file 保存 Cookie
-u user:pass 认证
-A "agent" User-Agent
-e "url" Referer

输出选项

选项 说明
-o file 输出到文件
-O 远程文件名保存
-i 显示头+正文
-I 只显示头
-s 静默模式
-v 详细输出
-w format 自定义格式
-# 进度条

连接选项

选项 说明
-L 跟随重定向
-k 跳过 SSL 验证
-m N 总超时
--retry N 重试次数
-x proxy 使用代理
--compressed 请求压缩
--http2 HTTP/2
-C - 断点续传

SSL 选项

选项 说明
--cacert file CA 证书
--cert file 客户端证书
--key file 私钥
--tlsv1.2 TLS 1.2
--tlsv1.3 TLS 1.3

B. HTTP 状态码

范围 含义
1xx 信息
2xx 成功
3xx 重定向
4xx 客户端错误
5xx 服务端错误
常见状态码 含义
200 OK
201 Created
204 No Content
301 永久重定向
302 临时重定向
304 未修改
400 Bad Request
401 Unauthorized
403 Forbidden
404 Not Found
429 Too Many Requests
500 Internal Server Error
502 Bad Gateway
503 Service Unavailable

C. 在线资源

  • 官方文档: https://curl.se/docs/
  • man page: https://curl.se/docs/manpage.html
  • 教程: https://curl.se/docs/manual.html
  • Everything curl: https://everything.curl.dev/
  • httpbin: https://httpbin.org/(测试服务)
  • Postman echo: https://postman-echo.com/

http://www.jsqmd.com/news/624585/

相关文章:

  • 为LFM2.5-1.2B-Thinking-GGUF配置JDK 1.8开发环境:Java调用示例
  • 手把手教你用Transformer玩转脑电信号:从CBraMod论文到实战EEG解码
  • 大模型微调必须在Q2前掌握的4项新范式:来自奇点大会Top 5厂商联合签署的《微调治理白皮书》
  • 别跟风做 279 模式!我见过 4 家实体做崩,核心错在这 1 点
  • RAG不是加个检索就行!2026奇点大会技术委员会主席亲授:4类典型业务场景下的RAG架构分层设计法则(含金融/医疗/政务真实案例)
  • 超越Excel!用DeepSeek+ggplot2制作动态科研图表:从基因表达到气候数据的实战案例
  • DP 套 DP 学习笔记
  • 科技向善:我们可以用技术为社会做些什么?
  • DeepSeek-R1:如何通过强化学习革新大语言模型的推理能力?
  • VibeVoice-TTS部署常见问题汇总:启动失败、模型加载、端口绑定
  • ORA-00054资源忙故障修复,远程处理Oracle报错解决方案,数据库锁超时NOWAIT指定问题排查
  • 深度认知:Anthropic 生态下的 AI 协作新范式 —— Claude 与 Claude Code 详解
  • 3种方法解锁Cursor Pro全部功能:免费提升开发效率的终极指南
  • 用DeepSeek做的Delphi闹钟
  • 5个简单步骤打造专业级OpenCore引导菜单:从零开始的美化指南
  • 操作系统面试必问:FCFS、SJF、HRRN调度算法到底怎么算?一个例子讲透
  • 如何快速将电视盒子变身高性能Linux服务器:Amlogic S9xxx Armbian终极指南
  • 为什么你的大模型A/B结果总不显著?揭秘3类隐性干扰源(用户意图漂移、Prompt扰动、Token级延迟偏差)
  • 从梯度下降到Adam:深入理解优化器背后的‘凸性’假设与实战影响
  • 存储那么贵,何不白嫖飞书云文件空间院
  • 基于NSGA-III进化算法的多目标电路优化器
  • 2025届必备的六大降AI率助手解析与推荐
  • 4.10 修复时间格式前后端不一致导致的崩溃问题,添加了删除设备和删除建筑功能(6小时)
  • RT-1深度解析:如何通过Transformer架构实现机器人控制的规模化泛化
  • 深信服aES升级后,别忘了检查这些客户端与规则库状态(从3.7.12升级到6.0.2R1实战复盘)
  • 光继电器光耦选型攻略:选对光耦,牢固电路安全
  • 美容加盟的大品牌排行怎么看?乐优妍为何越来越常被放进重点考察名单 - 速递信息
  • 避开数据灾难!SAP批量修改客户/供应商主数据的5个必查项
  • AltSnap:告别繁琐点击,Windows窗口管理新革命
  • ComfyUI工作流分享:一键生成社交媒体配图与头像壁纸