必须在下面的 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
在这里,我也从使用切换echo
到printf
(没有尾随换行符),以便更好地控制输出。
* 除非你真的知道你有必要的理由不引用。这些案例很少见,而且相距甚远。如有疑问,请引用。