Bash 环境变量不在父shell中持久化
我有以下bash脚本,它试图自动承担AWS角色,我显然已经删除了各种私有设置: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
#! /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-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随后返回一个错误,即令牌无效。还有,谢谢你的这个脚本,我找到这篇文章是因为我需要这个脚本,并且知道别人已经写了它!