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

두 번째 명령은 아마도 수백 자 이상의 긴 문자열에 대한 유효한 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자입니다. 두 번째 출력은 유효한 base64 형식이 아닙니다.

댓글과 피드백을 읽어보니 소스 base64 데이터가 아직 명령어와 완전히 호환되지 않는 것 같습니다 base64. 이 경우 예상치 못한 문자를 건너뛰어야 합니다.

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

여기서는 출력을 더 잘 제어하기 위해 echo( 후행 개행 없음) 사용에서 전환했습니다 .printf


* 너가 아니라면진짜인용하지 말아야 할 필요한 이유가 있다는 것을 알아두십시오. 이러한 경우는 드물고 그 사이가 멀습니다. 의심스러운 경우 인용하십시오.

관련 정보