2016-10-05 4 views
1

Bash에서 base64로 메시지 (특수 문자 포함 가능)를 디코딩합니다. 파일에 저장하면 48 바이트의 데이터가 생성됩니다. 그러나 변수에 전달하면 41 바이트의 문자열이됩니다. 이것은 Bash가 특수 문자를 처리하는 방식 (^ @)으로 인해 발생한다고 생각합니다. 예를 들어 Bash에서 바이트 배열 (특수 문자 포함 가능)

,

meow_bash=`printf $variable | base64 --decode` 
echo ${#meow_bash} # return 41 

printf $variable | base64 --decode > meow 
wc -c meow # return 48 

지금은 데이터의 민감성으로 인해 파일에 배열을 저장하지 않으려면. 또한 쉘 스크립트를 사용해야합니다. bash/sh를 사용하여 성공적으로 패스 할 수있는 방법이 있습니까?

+0

^@는 Null 바이트이며 bash 변수로 저장하거나 인수로 모든 프로그램에 전달할 수 없습니다. 바이너리 데이터에는 bash를 사용하지 마십시오. 당신은 base64를 저장할 수 있고, 언제든지 그것을 쓸 수 있습니다. –

+0

IIRC 나는 bash (나는 구 버전이라고 생각한다) 문자 삭제 (hex 7f)에 혼란스러워했다. 로캘에 따라 일부 도구는 예를 들어 처리하기를 거부 할 수 있습니다. 유효하지 않은 UTF-8 시퀀스 및 ...이 때문에 이진 데이터를 처리하는 셸 도구는 base64 (또는 16 진수 또는 이와 유사한 형식) 또는 파이프를 통해 가져옵니다. –

답변

4

, 당신의 확장을 인용하는 법을 배워야하십시오 C가 0 바이트로 끝나는대로 변수를 정의하는 것입니다 printf "$variable"하지 printf $variable

이 가장 간단한 원인을 사용합니다.
따라서 C 문자열에는 0 바이트가 포함될 수 없습니다.
배쉬 (c로 쓰여짐)는 변수 안에있는 0 값을 자동으로 제거합니다.

그러나 스트림 (파이프 등)에서 0 바이트로 작업 할 수 있습니다.

간단한 해결 방법은 변수 내부에 값을 저장하지 않는 것입니다 (디코딩 후).

또한 변수는 base64로 인코딩하여 저장하면 모든 바이트 값을 포함 할 수 있습니다.

더 바이트 지울 파이프에 변수의 값을 이용하여 :

$ variable="YWoAa2hzZ2RrAGxzawBmZGp2" 
$ printf '%s' "$variable" | base64 --decode | wc -c 
18 

이다 :는 스트림에 포함될 수를

따라서, 변수는 안전을 base64 인코딩 된 값이 할당 될 수있다 제로 값 바이트.

그러나 변수에 디코딩 된 값을 할당 :

$ variable="YWoAa2hzZ2RrAGxzawBmZGp2" 
$ meow_bash="$(printf '%s' "$variable" | base64 --decode)" 
$ printf '%s' "$meow_bash" | wc -c 
15 
$ echo "${#meow_bash}" 
15 

변수 $meow_bash 3 0 바이트를 잃었다.

+0

나는 집에 메시지를 가져갈 것 같아요 : 어떤 바이트 배열을 배쉬 변수에 직접 할당하지 말아라. – Chong