base64:yamlファイルの内容をデコードしようとしたときに誤った入力エラーが発生しました。

base64:yamlファイルの内容をデコードしようとしたときに誤った入力エラーが発生しました。

以下のエラーを生成するBase64エンコーディング値を正常にデコードするには、下のbashでどの特定の構文を変更する必要がありますか?

間違い:

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

2番目のコマンドは、おそらく何百文字以上の長い文字列の有効な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行の文字、引用符のない変数は76行1つを生成します。 x窒素文字と各グループの間のスペースは76文字です。 2番目の出力は有効なbase64形式ではありません。

コメントとフィードバックを読むと、ソースbase64データがまだ命令と完全に互換性がないようですbase64。この場合、予期しない文字をスキップする必要があります。

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

ここでは、出力をよりよく制御するためにecho(末尾改行なし)使用から切り替えました。printf


*あなたでなければ本物引用しないでください必要な理由があることに注意してください。このような場合はまれであり、その間は遠いです。疑わしい場合は引用してください。

関連情報