You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 21:35:17