Bash
base64:嘗試解碼 yaml 文件內容時出現無效輸入錯誤
必須在下面的 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
在這裡,我還從使用切換
echo
到printf
(沒有尾隨換行符),以便更好地控制輸出。
- 除非你真的知道你有必要的理由不報價。這些案例少之又少。如有疑問,請報價。