Windows CMD下使用jq、awk提取AWS Assume Role凭证存变量报错求助
Windows CMD环境下Assume Role凭证提取与环境变量设置适配方案
报错根源
原执行命令存在两处不兼容Windows CMD解析规则的问题:
- jq语法解析失败:查询表达式
.Credentials.AccessKeyId被额外嵌套了双引号,触发jq编译时的非法字符识别错误 - awk表达式截断:沿用*nix shell的单引号包裹awk代码的写法,在CMD环境下单引号会被当成普通字符,管道传入的内容被按空格拆分,形成无效的awk语法片段
可执行适配方案
方案1:无需awk,直接通过CMD原生命令完成环境变量设置
这是最稳妥的实现路径,从根源避开awk的引号转义问题:
- 执行以下命令捕获jq提取的AccessKeyId值,直接设置为当前CMD会话的环境变量:
for /f "delims=" %i in ('jq -r ".Credentials.AccessKeyId" mysession.json') do set AWS_ACCESS_KEY_ID=%i - 执行
echo %AWS_ACCESS_KEY_ID%验证变量值,和mysession.json中.Credentials.AccessKeyId字段的内容一致即为成功。
注:如果是在
.bat/.cmd批处理脚本中使用该命令,需要将循环变量%i替换为%%i,避免脚本解析时提前展开变量。
方案2:保留awk逻辑生成variables脚本文件
如果需要按照原需求,把set命令输出到variables文件中,可以使用以下适配转义规则的命令:
jq -r ".Credentials.AccessKeyId" mysession.json | awk "{print \"set\",\"AWS_ACCESS_KEY_ID=$0\"}" > variables
命令调整说明:
- 移除jq查询表达式外层多余的嵌套引号,将整个jq查询串用双引号包裹,符合CMD的参数解析规则
- 去掉awk代码外层的单引号,改用双引号包裹整个awk表达式;表达式内部需要使用的字符串双引号全部转义为
\",避免被CMD提前截断解析
生成的variables文件可以直接在CMD中执行,一次性完成对应环境变量的设置。
补充说明
- 上述命令设置的环境变量仅对当前打开的CMD会话生效,关闭窗口后变量会自动失效,如需永久保存用户级环境变量,可将
set命令替换为setx命令实现 - 所有命令均适配已安装jq、awk工具的Windows CMD运行环境,无需额外依赖
内容的提问来源于stack exchange,提问作者Ashish Joshi
相关产品推荐
相关产品推荐

