Bash 环境变量不在父shell中持久化

Bash 环境变量不在父shell中持久化,bash,shell,environment-variables,command-line-interface,aws-cli,Bash,Shell,Environment Variables,Command Line Interface,Aws Cli,我有以下bash脚本,它试图自动承担AWS角色,我显然已经删除了各种私有设置: #! /bin/bash # # Dependencies: # brew install jq # # Execute: # source aws-cli-assumerole.sh unset AWS_SESSION_TOKEN export AWS_ACCESS_KEY_ID=<user_access_key> export AWS_SECRET_ACCESS_KEY=<user_s

我有以下bash脚本,它试图自动承担AWS角色,我显然已经删除了各种私有设置:

#! /bin/bash
#
# Dependencies:
#   brew install jq
#
# Execute:
#   source aws-cli-assumerole.sh

unset AWS_SESSION_TOKEN
export AWS_ACCESS_KEY_ID=<user_access_key>
export AWS_SECRET_ACCESS_KEY=<user_secret_key>

temp_role=$(aws sts assume-role \
                    --role-arn "arn:aws:iam::<aws_account_number>:role/<role_name>" \
                    --role-session-name "<some_session_name>")

export AWS_ACCESS_KEY_ID=$(echo $temp_role | jq .Credentials.AccessKeyId)
export AWS_SECRET_ACCESS_KEY=$(echo $temp_role | jq .Credentials.SecretAccessKey)
export AWS_SESSION_TOKEN=$(echo $temp_role | jq .Credentials.SessionToken)

env | grep -i AWS_
我必须使用源代码执行此脚本,否则,如果使用标准bash或sh,则执行此脚本的父shell中无法使用导出的环境变量

问题是,即使使用源代码,它也不起作用;我的意思是:如果我执行env | grep AWS |我可以看到正确的值,那么环境变量及其正确/更新的值就会显示在父shell中

然后,如果我尝试使用AWS CLI工具(例如AWS s3 ls)列出特定帐户中的所有s3存储桶,我将承担该角色,它将报告访问密钥无效

但是,如果我手动复制并粘贴环境变量值,并在父shell中重新导出它们,有效地用已经设置的完全相同的值覆盖它们,那么AWS CLI命令将起作用,但我不知道为什么。有什么不同吗?

比如说 导出AWS_ACCESS_KEY_ID=$echo$temp_role | jq.Credentials.AccessKeyId 将结果键改为您需要的只是键,这就是为什么您的xargs在您的注释中工作

如果您将-r标志用于jq的raw,您将得到想要的结果
导出AWS_ACCESS_KEY_ID=$echo$temp_role | jq-r.Credentials.AccessKeyId

承担AWS角色的另一种方式:

编写一个配置文件,它将自动承担该角色

aws configure --profile new-profile set arn:aws:iam::<aws_account_number>:role/<role_name> 
要向新配置文件提供凭据,必须使用以下行之一:

aws配置-配置文件新配置文件集源\配置文件默认值 aws配置-配置文件新配置文件集凭据\u SourceEC2安装元数据 aws配置-配置文件新配置文件集凭据\u源电子容器 第1行在我的个人电脑上是正确的,因为我使用了默认配置文件。 当我使用AWS CodeBuild测试代码时,第3行是正确的。新配置文件使用了codepipeline角色的凭据

之后,您可以使用新的配置文件,例如: aws-在目标帐户中配置新配置文件s3 ls s3://bucket


文档:

您的脚本有DOS行结尾吗?您好,没有。我在Mac Unix系统上运行,无法在OSX 10.11.4(带bash-3.2)或bash-4.3(带aws cli/1.10)上重现此功能。21@Integralist你找到解决办法了吗?我在OSX 10.12上也经历了同样的事情。1@Daemeron我最后通过管道向xargs报告,现在我记不起逻辑/推理了,但这里有一个工作示例:在jq命令中添加-r确实解决了原始海报脚本的问题。整个问题在于访问密钥/令牌/id用引号括起来。AWS CLI随后返回一个错误,即令牌无效。还有,谢谢你的这个脚本,我找到这篇文章是因为我需要这个脚本,并且知道别人已经写了它!