所以我有这个curl命令。但我想将 API 密钥存储在名为 api.txt 的文件中,并将其加载到curl 命令中值所在的位置。
api.txt 文件包含
'X-Api:<API-KEY>'
这个命令有效。
curl -H 'X-Api:<API-KEY>' -T file.zip "https://URL"
尝试过:
curl -H “Content-Type: text/plain” -d “api.txt” -T file.zip "https://URL"
出现错误:
"errors" : [ {
"status" : 401,
"message" : "Unauthorized"
} ]
}%
问题:
- 如何加载实际的 api 密钥或 api.txt 中的预期行以将其解析为curl 命令?
- 这是这样做的方法吗?或者更好的方法?
答案1
curl -H "$(cat api.txt)" -T file.zip "https://URL"
或者,从输入文件中删除所有百分号和单引号:
curl -H "$(tr -d "'%" api.txt)" -T file.zip "https://URL"
或者,仅删除开头'
和'%
结尾的:
curl -H "$(sed -E "s/^'|'%$//g" api.txt)" -T file.zip "https://URL"
PS:我最初认为这需要分两行完成,以避免 api.txt 中的尾随换行符:
API_KEY=$(cat api.txt)
curl -H "$API_KEY" -T file.zip "https://URL"
但 bash 似乎改进了对输入文件末尾换行符的处理命令替换- 即,如果没有进一步的输入,它将删除它们。我使用的是 bash 5.1.16,如果您使用不同的 shell 或不同版本的 bash,您可能必须使用两行版本。
答案2
curl
支持@
从正确格式的文件中读取标头;这将比分叉更有效cat
,并且可能允许消除 shell,转而使用更简单、更高效、更不易出现安全缺陷的exec(3)
run 调用curl
,而不需要system(3)
shell:
curl -H '@api.txt' -T file.zip "https://..."
简单的 Bourne shell不需要@
引用,但它是为了防止某些 shell 对该角色执行某些操作。如果正在使用奇特的 shell(例如zsh
),请检查引用规则以查看哪些字符具有特殊含义,或主动引用所有内容。