Bash 从环境变量向curl传递证书
我正在为我的应用程序使用CORS监视器,需要执行以下操作:Bash 从环境变量向curl传递证书,bash,curl,hashicorp-vault,Bash,Curl,Hashicorp Vault,我正在为我的应用程序使用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/TES
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
vault kv get-字段crt my/cert/path/CACERT>CACERT.crt
vault kv get-字段crt my/cert/path/TESTCERT>cert.crt
vault kv get-字段密钥my/cert/path/TESTCERT>key.key
旋度-v\
--cacert CACERAT.crt\
--cert.crt\
--钥匙,钥匙\
--位置\
--请求获取'https://my.end.point'
#
rm CACERT.crt CERT.crt KEY.KEY
虽然这是可行的,但我宁愿不将证书写入文件,而是将它们保存在内存中,比如使用环境变量或一些我不知道的bash ISM
在我看来,它看起来更像这样:
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>
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'
CACERT=$(vault kv get-字段crt my/cert/path/CACERT)
证书=$(vault kv get-字段crt my/CERT/path/TESTCERT)
密钥=$(vault kv get-字段密钥my/cert/path/TESTCERT)
旋度-v\
--cacert$cacert\
--证书$cert\
--钥匙$key\
--位置\
--请求获取'https://my.end.point'
#
显然这是行不通的,因为curl需要文件路径,但为了说明起见,这可能吗?如果可能,这是一个糟糕的方法吗?也许还有另一种方法我没有考虑过?我知道我可以相对轻松地使用python完成上述操作,但是如果可能的话,我更喜欢使用bash+curl。对于仅使用POSIX的shell,可以用显式创建的命名管道替换进程替换 后台任务将不同的密钥和证书流式传输到其专用的命名管道
#/副秘书长/垃圾箱/环境卫生
#这些是随机命名的管道
cacert_管道=$(mktemp-u)
证书管道=$(mktemp-u)
键_管道=$(mktemp-u)
#在退出时删除命名管道
陷阱'rm-f--“$cacert_pipe”“$cert_pipe”“$key_pipe”退出
#创建命名管道
mkfifo--“$cacert_pipe”“$cert_pipe”“$key_pipe”|出口1
#启动后台shell以将数据流传输到相应的命名管道
vault kv get-现场crt my/cert/path/CACERT>“$CACERT\u管道”&
vault kv get-现场crt my/cert/path/TESTCERT>“$cert\u管道”&
vault kv get-现场密钥my/cert/path/TESTCERT>“$key\u管道”&
旋度-v\
--cacert“$cacert_管道”\
--证书“$cert_pipe”\
--图例“$key_pipe”\
--位置\
--请求获取'https://example.com/my.end.point'
与Bash的进程替换方法相比,其缺点是;在使用命名管道作为文件参数调用
curl
之前,需要显式重新启动流式处理任务。Bash支持使用将echo输出重定向到curl的stdin,并且每次连续重定向都会删除前一个重定向。这根本行不通。还有@LéaGris-谢谢你,我错了,把