여기에서 문서를 얻을 수 있나요?

여기에서 문서를 얻을 수 있나요?

다른 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.

더 나은 필터가 필요합니다.

관련 정보