为何在AWS CloudTrail脚本中需先Base64编解码再获取Username?
为什么遍历CloudTrail事件时需要Base64编解码?
你有一段能成功从AWS CloudTrail事件中提取Username的脚本:
es_eh="$(aws cloudtrail --region us-east-1 lookup-events --lookup-attributes AttributeKey=EventSource,AttributeValue=route53.amazonaws.com --max-items 50 --start-time "${start_date}" --end-time "${end_date}" --output json)" for row in $(echo "${es_eh}" | jq -r '.Events[] | @base64'); do echo "${row}" | base64 --decode | jq -r '.Username' done
但移除Base64编解码步骤后,脚本就无法正常工作:
es_eh="$(aws cloudtrail --region us-east-1 lookup-events --lookup-attributes AttributeKey=EventSource,AttributeValue=route53.amazonaws.com --max-items 50 --start-time "${start_date}" --end-time "${end_date}" --output json)" for row in $(echo "${es_eh}" | jq -r '.Events[]'); do echo "${row}"| jq -r '.Username' done
核心原因
这步Base64编解码是为了避免Bash循环分割JSON结构:
Bash的
for循环默认会把遍历内容按空格、换行符等空白字符拆分成多个独立项。而CloudTrail返回的每个Event是多行的完整JSON对象,直接用jq -r '.Events[]'输出后,Bash会把JSON里的每一行、每个空格都当成单独的循环项,导致后续jq处理时拿到的是不完整的JSON片段,根本无法解析出.Username字段。用
@base64把每个Event的JSON序列化成无空白字符的单行Base64字符串,这样Bash循环能完整拿到每个Event的编码内容,不会被分割。循环内部再解码回原始JSON,此时jq就能处理完整的对象,顺利提取目标字段。
举个直观例子:假设某个Event的JSON是多行结构:
{ "Username": "user1", "EventName": "CreateHostedZone" }
直接遍历的话,Bash会把{、"Username": "user1",、"EventName": "CreateHostedZone"、}拆成4个循环项,echo后jq无法识别这些片段为合法JSON,自然输出空值或报错。而Base64编码后,整个JSON变成一串连续字符串,循环能完整获取,解码后jq就能正常处理。
内容的提问来源于stack exchange,提问作者Rad4
相关产品推荐
相关产品推荐

