아래 오류를 발생시키는 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
* 너가 아니라면진짜인용하지 말아야 할 필요한 이유가 있다는 것을 알아두십시오. 이러한 경우는 드물고 그 사이가 멀습니다. 의심스러운 경우 인용하십시오.