Bash

base64:嘗試解碼 yaml 文件內容時出現無效輸入錯誤

  • April 15, 2022

必須在下面的 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 ~]$

使用變數時,請始終雙引號*。

可重複的例子

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

發生的情況是,帶引號的變數產生N行 76 個字元,但未加引號的變數產生 1 行 76 x N個字元加上每組 76 個字元之間的空格。第二個輸出不是有效的 base64 格式。

看了評論和回饋,貌似源碼base64數據還是和命令不完全兼容base64。在這種情況下,有必要跳過意外字元:

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

在這裡,我還從使用切換echoprintf(沒有尾隨換行符),以便更好地控制輸出。


  • 除非你真的知道你有必要的理由不報價。這些案例少之又少。如有疑問,請報價。

引用自:https://unix.stackexchange.com/questions/699114