base64:尝试解码 yaml 文件内容时出现无效输入错误

base64:尝试解码 yaml 文件内容时出现无效输入错误

必须在下面的 bash 中更改哪些特定语法才能成功解码引发下面错误的 Base64 编码值?

错误:

在 Azure 中运行的 RHEL 8 虚拟机的终端中输入以下 3 个简单命令:

[user@myVM ~]$ myVar=$(az keyvault secret show --name "secretName" --vault-name "vaultName" --query "value")
[user@myVM ~]$ echo $myVar
"very.long.base64.encoded.string.representing.the.original.yaml"
[user@myVM ~]$ echo $myVar | base64 --decode
base64: invalid input

第二个命令打印看起来像长字符串的有效 base64 编码的内容,可能是几百个字符或更多编码。

该错误base64: invalid input似乎表明base64程序无法接受其解码命令的编码输入。

源数据:

上面的base64编码数据的内容源自一个大概20行的yaml文件,通过地形的fileBase64()命令创建虚拟机前如下:

resource "azurerm_key_vault_secret" "secretName" {
  name         = "secretName"
  value        = filebase64(var.keySourceFile) 
  key_vault_id = azurerm_key_vault.vaultName.id
}

尝试用户建议的结果:

根据 @roaima 的建议,我们尝试了以下操作:

[user@myVM ~]$ az keyvault secret show --name "secretName" --vault-name "vaultName" --query "value"
"very.long.base64.encoded.string.representing.the.original.yaml=="
[user@myVM ~]$ myVar=$(az keyvault secret show --name "secretName" --vault-name "vaultName" --query "value")
[user@myVM ~]$ echo "$myVar" | base64 --decode >/dev/null 
base64: invalid input 

正如您所看到的,我们在将原始命令放入myVar.请注意,它以双引号结尾==并包围。

发送到 terraform 的原始源文件中的原始数据如下所示:

secret1: value1
secret2: value2 
...
secretN: valueN

然后我们尝试了以下操作,但您可以看到没有返回任何内容:

[user@myVM ~]$ printf '%s\n' "$myVar" | base64 --decode --ignore-garbage >/dev/null
[user@myVM ~]$

答案1

始终使用双引号当你使用它们时你的变量*

可重复的例子

myVar=$(perl -e 'print "hello, world. " x100, "\n"' | base64)
echo "$myVar"

echo $myVar | base64 --decode >/dev/null      # Fails
base64: invalid input

echo "$myVar" | base64 --decode >/dev/null    # Works

发生的事情是引用的变量产生行 76 个字符,但未加引号的变量生成 1 行 76 x字符加上每组 76 之间的空格。第二个输出不是有效的 base64 格式。

阅读评论和反馈,似乎源base64数据仍然与命令不完全兼容base64。在这种情况下,有必要跳过意外字符:

printf '%s' "$myVar" | base64 --decode --ignore-garbage

在这里,我也从使用切换echoprintf(没有尾随换行符),以便更好地控制输出。


* 除非你真的知道你有必要的理由不引用。这些案例很少见,而且相距甚远。如有疑问,请引用。

相关内容