다른 bash 스크립트의 구성 파일 역할을 하는 bash 스크립트가 있다고 가정해 보겠습니다.
구성.sh:
verbose=yes
echo "Malicious code!"
name=test
스크립트.sh:
source config.sh
echo "After sourcing: verbose='$verbose', name='$name'"
문제는 config.sh에 넣은 모든 항목이 실행되기 때문에 이것이 매우 안전하지 않다는 것입니다.
$ ./script.sh
Malicious code!
After sourcing: verbose='yes', name='test'
더 안전하게 만들기 위해 할당 작업을 정리하고 그 작업만 수행해야 한다고 생각했습니다. source
"여기에 문서"를 전달하여 이 작업을 수행 하겠습니다 .
스크립트.sh:
source <<EOF
$(grep -P '^\s*\w+=' test.sh)
EOF
echo "After sourcing: verbose='$verbose', name='$name'"
(예, 정규식은 그렇게 강력하지 않다는 것을 알고 있습니다. 단지 자리 표시자일 뿐입니다.) 안타깝게도 소스 코드는 여기 문서와 잘 작동하지 않는 것 같습니다.
./script.sh: line 1: source: filename argument required
source: usage: source filename [arguments]
After sourcing: verbose='', name=''
분명히 파일에서 구성 데이터를 가져오기 위해 할 수 있는 일이 많으며 어쨌든 그것이 더 안전할 것입니다.
하지만 나에게는 여전히 두려움이 남아 있었습니다. 내가 하려는 일이 효과가 있는지 알고 싶었습니다. 어떤 제안이 있으십니까?
답변1
source <(cat << EOF
A=42
EOF
)
echo $A
산출:
42
답변2
source
파일 이름이 필요하며 입력을 해당 파일로 리디렉션할 수 없습니다.
내 시스템에서는 프로세스 대체를 사용할 수 있습니다.
source <( grep = test.sh )
=
적절한 정규식으로 바꾸십시오 .
답변3
다음을 직접 사용할 수 있습니다 eval
.
eval "$(grep -P '^\s*\w+=' config.sh)"
#quotes needed if you want the full content of the file (including newlines etc.)
조달은 기본적으로 다음과 동일합니다.
eval "$(cat file)"
그러나 등호 오른쪽에 모든 kinz의 코드를 수행할 수도 있습니다.
a=$(evil_code_here)
b=`evil_code_here`
c="something" evil_code_here
#etc.
더 나은 필터가 필요합니다.