2017-07-18 74 views
0

我几乎在那里,“$我”是我有麻烦的地方。我尝试过$ {i},“$ i”,$ i。我确信有更多经验的人可以帮助我,我一直在为此工作1天。使我抓狂。将数组的变量迭代到命令本身是一个变量bash

session_name="Some-sesh_name" 
profile_name="ephemeral-${account_id}-${profile_path}-`date +%Y%m%d%H%M%S`" 
roles=("arn:aws:iam::11111111111111:role/role_name" "arn:aws:iam::222222222222:role/role_name") 

sts=($(
    aws sts assume-role \ 
    --role-arn "$i" \ 
    --role-session-name "$session_name" \ 
    --query 'Credentials.[AccessKeyId,SecretAccessKey,SessionToken]' \ 
    --output text 
)) 

for i in "${roles[@]}"; 
do $sts ; done 

aws configure set aws_access_key_id ${sts[0]} --profile ${profile_name} 
aws configure set aws_secret_access_key ${sts[1]} --profile ${profile_name} 
aws configure set aws_session_token ${sts[2]} --profile ${profile_name} 
+0

但是'$ i'在使用之前没有定义--role-arn“$ i”\ –

+0

没有测试过你的脚本 - 但乍一看,我认为你需要在sts定义中转义$ i: “\ $ I”。否则$ i在sts被定义时被评估。如果你想在循环内进行评估,它需要被转义。 –

回答

4

$i此刻正在扩大你定义sts阵列。之后,它不存在。

为了让这个aws命令可重复使用,使用函数:

roles=( 
    "arn:aws:iam::11111111111111:role/role_name" 
    "arn:aws:iam::222222222222:role/role_name" 
) 

sts() { 
    aws sts assume-role \ 
    --role-arn "$1" \ 
    --role-session-name "$session_name" \ 
    --query 'Credentials.[AccessKeyId,SecretAccessKey,SessionToken]' \ 
    --output text 
} 

for role in "${roles[@]}"; do 
    sts "$role" 
done 

注意在函数中使用的$1,检索的第一个参数。全局变量$session_name还行


我不明白你在与sts阵列想什么。在for循环中,您想将其称为命令,但configure命令使用数组的元素?在所有角色被假设之后?你想要使用返回的数据吗?

你想:

for role in "${roles[@]}"; do 
    data=($(sts "$role")) 
    aws configure set aws_access_key_id  "${data[0]}" --profile "$profile_name" 
    aws configure set aws_secret_access_key "${data[1]}" --profile "$profile_name" 
    aws configure set aws_session_token  "${data[2]}" --profile "$profile_name" 
done 

+0

答案正是需要。我不是一名训练有素的开发人员,但我会根据自己的需要做出决定。你们当然帮助过! Sts不应该是一个数组。 – shdobxr