系统学习 macOS 学习路径:从 BSD 文件命令到系统、网络与开发维护

curl

在 macOS 上发送 HTTP/HTTPS 请求,验证接口、下载文件和排查 TLS。

补充说明

curl 是 macOS 自带的传输工具,支持 HTTP、HTTPS、FTP、SMTP 等协议。排障时常用 -v 看请求头和 TLS 握手,-I 看响应头,-sS -o /dev/null -w '%{http_code}' 只看状态码,--resolve 在 DNS 生效前验证新 IP。默认不跟随重定向,也不把 4xx/5xx 当成失败,脚本必须显式加 -L 和 -f。

macOS 有两个 curl:/usr/bin/curl 是 Apple 构建,TLS 走 SecureTransport 并使用系统钥匙串信任;Homebrew 安装的 curl 通常用 OpenSSL/LibreSSL 和自带 CA bundle,新协议和新特性更多。两者对内部 CA、客户端证书和 HTTP/3 的支持可能不同,排 TLS 问题时先 which -a curl 和 curl -V 确认用的是哪一个。

curl 不读取“系统设置”里的代理配置,只认 http_proxy、https_proxy、ALL_PROXY、NO_PROXY 等环境变量或 -x。访问本机服务时注意 NO_PROXY 是否包含 localhost,否则请求会被代理绕走。

常用示例

# 只看响应头,确认状态码和服务器
% curl -I https://example.com

# 下载并显示状态码;-f 让 4xx/5xx 返回非零
% curl -fsSL -o /tmp/page.html -w '%{http_code}\n' https://example.com

# 显示握手和请求细节,排查证书、重定向、代理
% curl -v --connect-timeout 5 --max-time 20 https://example.com

# 发 JSON POST
% curl -sS -X POST -H 'Content-Type: application/json' \
  -d '{"name":"mac"}' https://api.example.com/items

# DNS 还没切换时,把域名强制解析到指定 IP
% curl --resolve example.com:443:192.0.2.10 https://example.com

# 使用内部 CA 或自签证书(不要把 -k 当成常规方案)
% curl --cacert ./internal-ca.pem https://internal.example.com

# 通过本地代理访问
% curl -x http://127.0.0.1:8080 -I https://example.com

# 查看当前 curl 的版本、TLS 后端和支持协议
% curl -V

易错点与排错

相关命令

参考链接

读完自测

合上页面,先回答,再展开对照。

  1. 为什么 curl 请求 404 页面后退出码仍是 0?怎样让它失败?
  2. -k 解决了什么问题,为什么不能长期使用?
  3. 怎样在 DNS 生效前验证新服务器的 HTTPS 是否正常?
答案
  1. 默认只把连接失败等传输错误当失败,HTTP 4xx/5xx 不算;加 -f(或 --fail-with-body)让 HTTP 错误返回非零。
  2. -k 跳过证书链和主机名校验,能绕过自签/过期证书报错,但会失去中间人防护;应改用 --cacert 或把 CA 加入信任。
  3. 用 curl --resolve 域名:443:新IP https://域名,把连接定向到新 IP,同时保留 SNI 和证书主机名校验。
微信小程序码:扫码打开命令速查小程序

小程序版

微信扫码,随时查命令