【发布时间】:2019-02-17 08:26:20
【问题描述】:
我正在尝试使用 bash 中的 while 循环遍历 3 个文件的内容。它们包含名称、aws 帐户和 aws 帐号的列表。
但循环不正确,它不断重复列表中的名字和列表中的第一个 aws 环境。
这是我看到的输出:
AWS user name: aadatiya does not exist in AWS account: company-lab
AWS user name: aadatiya does not exist in AWS account: company-lab
AWS user name: aadatiya does not exist in AWS account: company-lab
AWS user name: aadatiya does not exist in AWS account: company-lab
AWS user name: aadatiya does not exist in AWS account: company-lab
AWS user name: aadatiya does not exist in AWS account: company-lab
AWS user name: aadatiya does not exist in AWS account: company-lab
AWS user name: aadatiya does not exist in AWS account: company-lab
这些是我要读取的文件:
aws_users_all="source_files/aws_users_all.txt"
示例输出:
aadatiya
abigailcharles
tdunphy
broberts
下一个文件:
aws_env_list="source_files/aws_environments_all.txt"
示例输出:
company-lab
company-stage
company-nonprod
company-prod
最后一个文件: aws_account_numbers="source_files/aws_account_numbers.txt" 示例输出:
123456789191
987654321211
456721231213
123213512321
这是循环错误的代码:
ofile=source_files/aws_access_keys/company-aws-access-keys-all-accounts.csv
while IFS= read -r aws_user_name
do
while IFS= read -r aws_key
do
while IFS= read -r aws_account_num
do
user_lives_here=$(aws iam get-user --user-name "$aws_user_name" --profile="$aws_key" 2> /dev/null | jq -r '.User.UserName')
if [[ -z "$user_lives_here" ]]; then
printf "AWS user name: %s does not exist in AWS account: %s\\n(%s)" "$aws_user_name" "$aws_key" "$aws_account_num"
else
echo "$aws_user_name,$user_access_key1,$key1_date_created,$key1_last_used,$key1AgeDays,$aws_key,$aws_account_num" >> $ofile
fi
done < "$aws_account_numbers"
done < "$aws_env_list"
done < "$aws_users_all"
如果我取出一个级别(帐号级别),脚本会按预期运行并产生以下输出:
AWS user name: aadatiya does not exist in AWS account: company-lab
AWS user name: aadatiya does not exist in AWS account: company-bill
AWS user name: aadatiya does not exist in AWS account: company-stage
AWS user name: aadatiya does not exist in AWS account: company-dlab
AWS user name: aadatiya does not exist in AWS account: company-nonprod
AWS user name: aadatiya does not exist in AWS account: company-prod
AWS user name: aadatiya does not exist in AWS account: company-govcloud-admin-nonprod
AWS user name: abigailcharles does not exist in AWS account: company-lab
AWS user name: abigailcharles does not exist in AWS account: company-bill
AWS user name: abigailcharles does not exist in AWS account: company-stage
AWS user name: abigailcharles does not exist in AWS account: company-dlab
AWS user name: abigailcharles does not exist in AWS account: company-nonprod
AWS user name: abigailcharles does not exist in AWS account: company-prod
AWS user name: abigailcharles does not exist in AWS account: company-govcloud-admin-nonprod
我刚刚注释掉了这个级别,它可以工作:
#while IFS= read -r aws_account_num
#do
#done
如何正确执行此操作,以便循环遍历每个名称、aws 帐户和 aws 帐号,以便每个条目显示一次?
【问题讨论】:
-
您能否添加预期的示例输出以及所有“aws-*”文件的示例内容
-
好吧,您的脚本运行正常。对于每个用户名,您检查每个键。在其中,foreach 键,您检查每个帐号。我是否正确假设您要检查的是每个用户名只使用相应的密钥和帐号一次?
-
谢谢大家。我已经用我想要的示例输出更新了 OP,并且更清楚地解释了我正在尝试做的事情。
-
你能添加示例输入吗?
-
这些文件是否相关? aws_user_name、aws_key 和 aws_account_num 是否相关?在这种情况下,您可以使用单个循环,而不是您现在拥有的嵌套循环。请参阅这篇文章以了解如何一次读取三个文件:Looping through the content of a file in Bash。
标签: bash