줄 바꿈과 특수 문자가 포함된 파일에서 환경 변수를 만들고 싶다는 점을 고려하면 다음과 같습니다. 단서는 콘텐츠가 해석되어야 하는 다른 환경 변수를 참조할 수 있다는 것입니다. 어쩌면 평범한 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}
하지만 어떻게 해야 할까요?
- ${FOOBAR}를 위에서 정의한 "SUCCESS"로 설정하고 나머지는 그대로 두시겠습니까?
- 내용이 (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
명령 대체나 유사한 수단을 통해 다른 프로그램을 실행할 위험이 없습니다. 이것은 매우 간단한 쉘 템플릿 도구입니다.
envsubst
gettext-base
GNU 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
파일의 내용이 귀하의 완전한 통제하에 있지 않다면 이는 명령 주입 취약점임이 분명합니다.