bash - 从环境变量传递证书到 curl
问题描述
我正在为我的应用程序开发 CORS 监视器,需要执行以下操作:
- 从我们的 Hashicorp Vault 实例下载证书
- 使用这些证书卷曲端点
- 评估响应
我目前可以这样做:
vault kv get -field crt my/cert/path/CACERT > CACERT.crt
vault kv get -field crt my/cert/path/TESTCERT > CERT.crt
vault kv get -field key my/cert/path/TESTCERT > KEY.key
curl -v\
--cacert CACERAT.crt \
--cert CERT.crt \
--key KEY.key \
--location \
--request GET 'https://my.end.point'
# <evaluate here>
rm CACERT.crt CERT.crt KEY.key
虽然这可行,但我宁愿不将证书写入文件,而是将它们保存在内存中,例如使用环境变量或一些我不知道的 bash-isms。
在我看来,它看起来更像这样:
CACERT=$(vault kv get -field crt my/cert/path/CACERT)
CERT=$(vault kv get -field crt my/cert/path/TESTCERT)
KEY=$(vault kv get -field key my/cert/path/TESTCERT)
curl -v\
--cacert $CACERT \
--cert $CERT \
--key $KEY \
--location \
--request GET 'https://my.end.point'
# <evaluate here>
显然这不起作用,因为 curl 期待文件路径,但为了说明目的,这可能吗?如果可能的话,这是一个糟糕的方法吗?也许还有另一种我没有考虑过的方法来解决这个问题?我知道我可以相对容易地使用 python 完成上述操作,但是如果可能的话,我更愿意坚持使用 bash + curl。
解决方案
Bash 支持使用语法进行进程替换。<(cmd)
这会导致 的输出cmd
被替换为文件名。这允许您将命令输出作为预期文件名的参数传递。
在您的示例中,您将执行以下操作:
CACERT=$(vault kv get -field crt my/cert/path/CACERT)
CERT=$(vault kv get -field crt my/cert/path/TESTCERT)
KEY=$(vault kv get -field key my/cert/path/TESTCERT)
curl -v \
--cacert <(echo "$CACERT") \
--cert <(echo "$CERT") \
--key <(echo "$KEY") \
--location \
--request GET 'https://my.end.point'
推荐阅读
- amazon-web-services - 在将 aws lambda 与 redis 连接时,任务在 23.02 秒后超时错误
- javascript - Laravel 表格,每行都有编辑模式
- python - 如何修复 python2.7 中的“导入错误:未命名模块”
- cuda - 如何在 VS CUDA 项目中使用“pragma omp task”?
- bluetooth - BLE 和 Windows10 的一般问题
- c++ - 如何打印多维数组的特定行
- awk - 有没有办法在编号的字符串中找到重复的模式?
- kubernetes - Kubernetes - 从 Job 连接到 Pod
- jestjs - JEST:忽略预期错误对象中的制表符/空格
- python - 是什么让 randint 与 randbelow 不同?