shell base64编码和解码aws命令以检索某些字段

sczxawaw  于 2023-02-05  发布在  Shell
关注(0)|答案(3)|浏览(168)

有人能解释一下下面的代码吗?
下面的代码使用username生成预期的结果。

for row in $(echo "${es_eh}" | jq -r '.Events[] | @base64'); do
    echo "${row}" | base64 --decode | jq -r '.Username'

我不明白在循环中对同一个字符串进行base64编码和解码以检索用户名的目的。
当我删除base64编码和解码时,这不起作用。

for row in $(echo "${es_eh}" | jq -r '.Events[]'); do
    echo "${row}"| jq -r '.Username'

es_eh包含下面的aws命令的json输出,

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)"
d5vmydt9

d5vmydt91#

如果不使用编码,第一个jq的输出将不止一行。循环将遍历各行,但由于没有一行包含有效的JSON而失败。如果使用| @base64,每个子对象将被编码为一行,并通过base64 --decode膨胀回完整的JSON对象。
要查看行,请尝试在处理$row之前输出它。

wgmfuz8q

wgmfuz8q2#

当你使用$( )而不加引号时,结果会被拆分成“单词”,但是shell对“单词”的定义几乎从来都不是你想要的(当然也和你想要拆分成的json条目无关),这就是为什么你几乎不应该使用不加引号的扩展。
将输出条目转换为base64会使它们变得非常像单词,因此shell单词拆分实际上是正确的。一些base64编码器将它们的输出分割成行,这将使得每行被视为单独的“字”。如果jq的base64编码这样做,则该代码在大事件时将灾难性地失败。

5lwkijsr

5lwkijsr3#

for循环转换为while循环应该可以修复此问题:

while read -r row; do
    echo "${row}" | jq -r '.Username' 
done < <(echo "${es_eh}" | jq -c -r '.Events[]')

注意,在外部jq中,我使用了选项-c将输出放在一行中。

相关问题