줄 바꿈 및 기타 특수 문자를 사용하여 파일 내용을 환경 변수로 설정하고 포함된 변수를 해석합니다.

줄 바꿈 및 기타 특수 문자를 사용하여 파일 내용을 환경 변수로 설정하고 포함된 변수를 해석합니다.

줄 바꿈과 특수 문자가 포함된 파일에서 환경 변수를 만들고 싶다는 점을 고려하면 다음과 같습니다. 단서는 콘텐츠가 해석되어야 하는 다른 환경 변수를 참조할 수 있다는 것입니다. 어쩌면 평범한 bash보다 더 정교한 것이 필요할 수도 있습니다.

테스트 파일 "testfile.txt"는 다음과 같습니다.

* foo
\/-!~ 
FOO=${FOOBAR}

지금까지 제가 직접 관리한 내용은 다음과 같습니다.

#!/bin/bash
FOOBAR="SUCCESS"
file="testfile.txt"
var_name="TEST"
name="$file"
content="$(<$file)"
echo "$content"

이것은 나에게 출력으로 컨텍스트 변수를 제공합니다(따라서 정확히 파일의 내용).

* foo
\/-!~
FOO=${FOOBAR}

하지만 어떻게 해야 할까요?

  1. ${FOOBAR}를 위에서 정의한 "SUCCESS"로 설정하고 나머지는 그대로 두시겠습니까?
  2. 내용이 (1)인 환경 변수 TEST를 설정합니까?

답변1

이 답변은 허용된 답변을 기반으로 하고 조정되었습니다.https://stackoverflow.com/questions/10683349/forcing-bash-to-expand-variables-in-a-string-loaded-from-a-file

#!/bin/bash
export FOOBAR="SUCCESS"
file="testfile.txt"
var_name="TEST"
name="$file"

content="$(envsubst < "$file")"
echo "$content"

eval단순히 변수를 바꾸는 것과 달리 envsubst명령 대체나 유사한 수단을 통해 다른 프로그램을 실행할 위험이 없습니다. 이것은 매우 간단한 쉘 템플릿 도구입니다.

envsubstgettext-baseGNU gettext 국제화 유틸리티의 일부입니다(Debian에서는 패키지에 있음 ).

envsubst(쉘 내장이 아닌 외부 명령으로) 내보낸 변수만 볼 수 있습니다(그러나 쉘이 이후에 정의된 변수를 환경으로 내보내도록 하려면 표준 옵션을 참조하십시오 ) allexport.sh

답변2

노력하다:

eval "content=\$(cat << @@@EOF@@@
$(cat file)
@@@EOF@@@
)"

이는 인수, 산술 및 명령 대체를 확장하고 이스케이프( 및 그 자체만) 및 줄 연속 \에 사용됩니다 . 예를 들어 다음과 같은 입력의 경우:$`

* foo
\/-!~ 
FOO=${FOOBAR} $((1+1)) $(uname)
\${FOOBAR}\\foo\
bar

이것은 다음과 같은 것을 제공합니다:

* foo
\/-!~
FOO=content-of-$FOOBAR 2 Linux
${FOOBAR}\foobar

파일의 내용이 귀하의 완전한 통제하에 있지 않다면 이는 명령 주입 취약점임이 분명합니다.

관련 정보