Base64로 디코딩된 문자열을 변수에 할당할 때 0x00이 제거되는 이유는 무엇입니까?

Base64로 디코딩된 문자열을 변수에 할당할 때 0x00이 제거되는 이유는 무엇입니까?

저는 Mac을 사용하고 있습니다. Bash에서는 Base64 문자열을 디코딩한 다음 16진수 값을 인쇄하려고 합니다. 명령을 사용한 base64 -d다음 변수에 할당하고 있습니다.

myText='YYN29+2wV2XRAHymIyhgytWuqY4atgHnIUFfXA7FPOA='
myTextBytes=$(echo -n "$myText" | base64 --decode)
echo -n $myTextBytes | xxd -p -c 99999

위 스크립트의 출력은 다음과 같습니다.

618376f7edb05765d17ca6232860cad5aea98e1ab601e721415f5c0ec53ce0

그러나 다음 명령을 직접 실행하면:

echo -n "$myText" | base64 --decode | xxd -p -c 100000

나는 얻다:

618376f7edb05765d1007ca6232860cad5aea98e1ab601e721415f5c0ec53ce0

나는 심지어 사용해 보았고 openssl enc -base64같은 결과를 얻었습니다. 즉, 00변수에 할당되면 삭제됩니다. 00변수에 할당할 때 어떻게 유지합니까?

답변1

이는 두 개의 0x30 문자(ASCII "0")로 구성된 문자열의 "00"이 아니라 NUL 문자 0x00입니다. 디코드 명령의 출력을 또는 로 가져오면 od -a이 내용을 볼 수 있습니다 od -x.

Bash의 명령 대체 처리(예: )는 var1=$( command )NUL/0x00 문자를 제거합니다. 그러나 Bash 4.4부터는 경고도 인쇄됩니다. NUL 바이트를 처리할 수 없다는 점은 대부분의 쉘의 한계이며 zsh는 예외입니다. 그러나 여전히 영향을 받는 zsh 명령에 대한 인수에 포함된 0x00 문자를 전달하는 데 문제가 있습니다(이는 zsh의 문제가 아니라 명령에 대한 exec() 시리즈 호출의 문제이기 때문입니다).

Perl, Python, Ruby 등과 같은 다른 언어로 전환하고 싶지 않다면 zsh를 사용해 보는 것이 좋습니다.

관련 정보