curl 使用有序的命令行传输 URL:选项用于配置一个或多个传输,而每个 URL 都会启动一次传输。它支持多种协议;下面的示例使用 HTTP,因为其请求和响应控制方式具有普遍性。
有意构建请求 #
使用 --request、--header 和 --data 明确声明请求。除非指定其他方法,否则 --data 会选择 POST。--data-binary @file 会保留文件的字节,而 --data @file 具有面向表单的行为。
curl --fail-with-body --show-error --silent \
--request POST \
--header 'Content-Type: application/json' \
--header "Authorization: Bearer $token" \
--data-binary @request.json \
--output response.json \
https://api.example.invalid/v1/jobs在可能的情况下,不要让凭据出现在命令历史中:使用受限的配置文件、凭据助手,或由服务支持的身份验证机制读取的环境变量。在某些系统上,-u user:password 可能会使密码暴露在进程列表中。
-L 会跟随重定向。当方法或凭据不得发送到其他源时,应限制其使用范围;在自动化之前,使用 --verbose 检查重定向行为。
多次传输和 URL glob #
curl 区分全局选项和每次传输的选项。--verbose 等全局选项会在 --next 之后继续生效;--header、--request 和 --output 等局部选项会在 --next 开始新操作时重置。不使用 --next 时,局部选项会应用于后续每个 URL,直到被修改,因此每个请求都必须明确指定有意使用的输出和请求头集合。
curl --output first.json https://example.invalid/one \
--next --header 'Accept: text/plain' \
--output second.txt https://example.invalid/two为防止 shell 展开,请使用引号包围 URL glob 语法。curl 会展开 [] 范围和 {} 列表;--output 中的 #1、#2 以及后续占位符引用相匹配的 glob 组件。
curl 'https://example.invalid/page[1-3].json' --output 'page-#1.json'当字面量方括号或花括号属于 URL 时,使用 --globoff。
诊断传输路径 #
使用 --verbose 获取请求、响应、代理和 TLS 协商的详细信息。使用 --write-out 记录稳定的计时和状态数据,而无需解析面向人的输出。
curl --silent --show-error --output /dev/null \
--write-out 'http=%{response_code} dns=%{time_namelookup} connect=%{time_connect} total=%{time_total}\n' \
https://example.invalid/--resolve host:port:address 会在保留 URL 主机名和 TLS SNI 的同时测试指定地址。--connect-to 以更通用的方式重定向连接。--proxy 选择代理,--noproxy 将主机排除在代理使用范围之外。不要使用 --insecure 修复证书失败;应修正 URL、信任链、主机名或本地 CA 配置。
可复现地捕获结果 #
--fail-with-body 会在保留错误响应的同时,使 HTTP 状态错误返回非零状态。请检查 curl 的退出状态,因为 TCP 交换成功并不代表 HTTP 请求成功。仅对适合重复执行的传输使用 --retry:重试幂等的 GET 与重复执行支付用 POST 并不等价。
捕获构件时,应分别写入响应头和正文,固定完整 URL,并保存计时元数据:
curl --fail --show-error --location \
--dump-header artifact.headers \
--output artifact.tar.xz \
--write-out '%{url_effective} %{response_code}\n' \
https://downloads.example.invalid/tool-1.2.3.tar.xz
sha256sum artifact.tar.xz验证已发布的校验和或签名;在不受信任的下载之后生成的校验和只能记录实际接收的字节。
评论
在 GitHub 上阅读或评论(发表评论需要登录)