必须在下面的 bash 中更改哪些特定语法才能成功解码引发下面错误的 base64 编码值?
错误:
在 Azure 中运行的 RHEL 8 vm 的终端中键入以下 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 文件,在创建 VM 之前,该文件通过terraform 的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 ~]$
使用变量时,请始终双引号*。
可重复的例子
发生的情况是,带引号的变量产生N行 76 个字符,但未加引号的变量产生 1 行 76 x N个字符加上每组 76 个字符之间的空格。第二个输出不是有效的 base64 格式。
看了评论和反馈,貌似源码base64数据还是和命令不完全兼容
base64
。在这种情况下,有必要跳过意外字符:在这里,我还从使用切换
echo
到printf
(没有尾随换行符),以便更好地控制输出。* 除非你真的知道你有必要的理由不报价。这些案例很少见。如有疑问,请报价。