curl 日常运维全景

一、连通性与基础排错

1. 测试端口是否可达,比 telnet / nc 好在:curl 能同时测 TCP 连通 + HTTP 响应,一步到位

# 最常用:测试 TCP 端口通不通
curl -v telnet://192.168.1.10:3306

# 或利用 HTTP 测试
curl -v --connect-timeout 5 http://192.168.1.10:8080

2、只看 HTTP 状态码(批量巡检神器)

# -s 静默 -o 丢弃响应体 -w 只输出状态码
curl -s -o /dev/null -w "%{http_code}" https://example.com

# 批量巡检
for url in $(cat url_list.txt); do
  code=$(curl -s -o /dev/null -w "%{http_code}" --connect-timeout 3 "$url")
  echo "$url → $code"
done

3. 完整请求链路计时(排延迟必用)

# 自定义输出格式
curl -w '
DNS解析:    %{time_namelookup}s
TCP连接:    %{time_connect}s
TLS握手:    %{time_appconnect}s
首字节:     %{time_starttransfer}s
总耗时:     %{time_total}s
下载速度:   %{speed_download} B/s
' -o /dev/null -s https://example.com

输出结果:

DNS解析:    0.012s
TCP连接:    0.045s
TLS握手:    0.138s
首字节:     0.203s
总耗时:     0.215s
  • time_namelookup 高 → DNS 慢
  • time_connect – time_namelookup 高 → TCP 握手慢 / 网络 RTT 高
  • time_appconnect – time_connect 高 → TLS 握手慢
  • time_starttransfer – time_appconnect 高 → 服务端处理慢

4. 强制 IPv4 / IPv6

curl -4 https://example.com    # 强制 IPv4
curl -6 https://example.com    # 强制 IPv6

5. 跳过 DNS 直接用 IP 访问(验证 DNS 问题)

curl -v --resolve example.com:443:93.184.216.34 https://example.com

二、HTTP 协议调试

1. 看完整请求+响应头

curl -v https://example.com
# -v = verbose,显示请求头、响应头、SSL 信息

# 只显示响应头
curl -I https://example.com

# 显示请求头 + 响应头(更干净)
curl -s -D - https://example.com -o /dev/null

2. 指定 Host 头(测试虚拟主机)

# 用 IP 访问,但指定 Host
curl -H "Host: api.example.com" http://93.184.216.34/

# 或
curl --header "Host: api.example.com" http://93.184.216.34/

3. 自定义 Header

curl -H "Authorization: Bearer xxxxxx" https://api.example.com/v1/users
curl -H "Content-Type: application/json" -H "X-Request-ID: 12345" https://api.example.com

4. 跟随重定向

curl -L https://example.com
# 不加 -L 的话,遇到 301/302 只返回跳转头,不跟过去

5. 查看最终 URL(重定向链)

curl -s -o /dev/null -w "%{url_effective}" -L https://example.com

三、请求方法 + 数据发送

1. GET 带参数

curl "https://api.example.com/search?q=hello&page=1"

2. POST 表单

curl -X POST -d "username=admin&password=123456" https://api.example.com/login

# 编码
curl --data-urlencode "q=hello world" https://api.example.com/search

3. POST JSON(调 API 最常用)

curl -X POST \
  -H "Content-Type: application/json" \
  -d '{"name":"张三","age":30,"tags":["a","b"]}' \
  https://api.example.com/v1/users

# 从文件读 body
curl -X POST -H "Content-Type: application/json" -d @body.json https://api.example.com

4. PUT / PATCH / DELETE

curl -X PUT -d '{"status":"active"}' https://api.example.com/v1/users/1
curl -X PATCH -d '{"email":"new@example.com"}' https://api.example.com/v1/users/1
curl -X DELETE https://api.example.com/v1/users/1

5. 上传文件

curl -X POST -F "file=@/tmp/test.jpg" https://api.example.com/upload

# 多文件 + 额外字段
curl -X POST \
  -F "file1=@/tmp/a.jpg" \
  -F "file2=@/tmp/b.jpg" \
  -F "description=测试上传" \
  https://api.example.com/upload

四、HTTPS / TLS 排错

1. 忽略证书验证(临时测试)

curl -k https://example.com
# 或
curl --insecure https://example.com

2. 指定客户端证书(双向 TLS)

curl --cert client.pem --key client.key https://api.example.com
curl --cert client.p12:密码 https://api.example.com

3、指定 CA 证书(自签 CA)

curl --cacert ca.crt https://internal.example.com

4、查看 TLS 握手详情

curl -v --trace - https://example.com 2>&1 | grep -i ssl

5、强制指定 TLS 版本

curl --tlsv1.2 https://example.com
curl --tlsv1.3 https://example.com

五、性能测试与压测

1、并发请求(配合 xargs)

# 10 个并发,每个请求 1 次
seq 100 | xargs -P 10 -I {} curl -s -o /dev/null -w "%{http_code}\n" https://example.com

2、持续请求 + 统计

# 请求 1000 次,统计成功/失败
for i in $(seq 1 1000); do
  curl -s -o /dev/null -w "%{http_code}" --connect-timeout 3 https://example.com || echo "000"
done | sort | uniq -c

3、限制速率(模拟慢网络)

curl --limit-rate 100K https://example.com/large-file.zip

六、文件下载

1、下载文件

curl -O https://example.com/file.zip          # 保留原文件名
curl -o myfile.zip https://example.com/file.zip  # 指定文件名
curl -C - -O https://example.com/big.iso     # 断点续传

2、下载 + 进度条

curl -# -O https://example.com/file.zip # 进度条
curl -s -O https://example.com/file.zip # 静默

七、认证

1、Basic Auth

curl -u username:password https://api.example.com

2、Bearer Token

curl -H "Authorization: Bearer eyJhbGciOi..." https://api.example.com

3、Cookie

curl -b "sessionid=abc123; user=admin" https://example.com
curl -c cookies.txt https://example.com/login  # 保存 cookie
curl -b cookies.txt https://example.com/dashboard  # 带 cookie 请求

八、代理

1、HTTP代理

curl -x http://proxy:8080 https://example.com
curl --proxy http://user:pass@proxy:8080 https://example.com

2、SOCKS 代理

curl --socks5 127.0.0.1:1080 https://example.com

3、不走代理

curl --noproxy "*" https://internal.example.com

九、调试与抓包

1、输出完整通信过程

curl -v https://example.com                    # 显示 header
curl --trace trace.log https://example.com     # 二进制级追踪
curl --trace-ascii trace.txt https://example.com  # ASCII 追踪

2、只看特定信息

# 只看响应头
curl -s -D - https://example.com -o /dev/null

# 只看 IP 和端口
curl -s -o /dev/null -w "IP: %{remote_ip}  Port: %{remote_port}\n" https://example.com

# 看 SSL 证书信息
curl -v https://example.com 2>&1 | grep -i "subject:\|issuer:\|expire"

十、运维脚本常用变量速查

# curl -w 可用变量(最常用)
%{http_code}           # HTTP 状态码
%{time_namelookup}     # DNS 解析时间
%{time_connect}        # TCP 连接时间
%{time_appconnect}     # TLS 握手时间
%{time_starttransfer}  # 首字节时间
%{time_total}          # 总耗时
%{speed_download}      # 下载速度
%{remote_ip}           # 远程 IP
%{remote_port}         # 远程端口
%{url_effective}       # 最终 URL
%{num_redirects}       # 重定向次数
%{size_download}       # 下载字节数
%{response_code}       # 同 http_code

十一、常见运维场景速查

场景命令
端口通不通curl -v --connect-timeout 5 http://IP:PORT
网站状态码curl -s -o /dev/null -w "%{http_code}" URL
接口延迟分析curl -w "@format" -o /dev/null -s URL
调 POST APIcurl -X POST -H "Content-Type: application/json" -d '{}' URL
忽略证书测内网curl -k -v https://内网IP
模拟 Host 访问curl -H "Host: xxx" http://IP
文件下载curl -O URL
断点续传curl -C - -O URL
带 Cookie 请求curl -b "key=val" URL
代理测试curl -x proxy:port URL
强制 IPv4curl -4 URL
看重定向链curl -L -s -o /dev/null -w "%{url_effective}" URL
批量健康检查for ip in ips; do curl -s -o /dev/null -w "%{http_code}" http://$ip/health; done