bash에 바이너리보다 안전한 "triple less than"<<< 연산자가 있습니까?


27

이것은 다소 가상적인 질문이므로 왜 내가 이것을하고 싶은지 묻지 마십시오.

GIF바이너리 데이터를 포함 하는 변수 가 있고 파이프 |연산자를 사용할 수 없다고 가정 하면 다음과 같이 'triple-less-than'연산자를 사용하는 올바른 방법 이어야 합니다.

openssl enc -base64 <<< $GIF

그러나 바이너리 안전<<< 하지 않은 것으로 보이 므로 바이너리 데이터가 손상됩니다.

바이너리 안전 동등 물이 있습니까?


bash 변수는 NUL 문자를 포함 할 수 없습니다. 따라서 $GIF시작을위한 변수 는 시작하기 전에도 전체 이진을 유지하지 않습니다. 그러나 NUL 캐릭터를 제외하고는 다른 모든 캐릭터를 보유하고 있습니다. (ref : vaab.blog.kal.fr/2014/05/03/… )
vaab

답변:


31

여기 문자열 리디렉션 ( <<<)의 간단한 양식입니다 여기에 문서 리디렉션 ( <<). 여기서 문자열 리디렉션은 "이진 안전"이 아닙니다. Bash는 here 문자열에서 확장을 수행합니다. 또한 Bash는 here 문자열의 끝에 줄 바꿈을 추가합니다 (명령을 실행 xxd -p <<< "foo"하면 666f6f0a반환됩니다).

파이프를 제외한 유일한 안전한 방법은 I / O 리디렉션 입니다.

유사하지 바이너리 안전 질문 여기 . 인코딩 된 데이터를 저장하고 시도해 볼 수 있습니다

COMMAND_WITH_BIN_INPUT <(uudecode <(echo "$uuEncodedData")) 

그러나 이것은 멀지 않습니다

echo "$uuEncodedData"|uudecode|COMMAND_WITH_BIN_INPUT

파이프 메타 문자가 없습니다.


1
또는 16 진수 값 대신에 시도 od -a <<< ""하십시오 nl.
jcalfee314

@Wesley archive.org도 있습니다. :) 원래 링크 : web.archive.org/web/20120126213653/http://tldp.org/LDP/abs/html/…
Jason C

4

Bash는 일반적으로 이진 안전하지 않으며 대체 중에 이진 내용을 포함하는 변수의 null 및 개행을 손상시킵니다.

그래서 대답은 "아니오"이지만 더 근본적으로는 "쉘 스크립팅 언어가 아님"이라고 생각합니다. 왜냐하면 모두 바이너리에 문제가있는 것 같습니다.

그러나 데이터를 $ GIF로 가져 오거나 대신 파일로 가져 오거나 python을 문제없이 이진 데이터를 처리하는 대체 스크립팅 언어로 사용하려고합니다.


1
참조 또는 정확성 또는 간단한 예는 당신의 측면에서 거친 추측과 일반적인 느낌보다 더 도움이 될 것입니다. bash를 통해 이진 데이터를 구문 분석하는 방법이 있습니다.
vaab
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.