"여기 문서"를 소싱할 수 있습니까?

"여기 문서"를 소싱할 수 있습니까?

다른 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)"   

그러나 사람들은 등호 오른쪽에서 모든 종류의 코덱을 실행할 수 있습니다.

a=$(evil_code_here)
b=`evil_code_here`
c="something" evil_code_here
#etc.

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

관련 정보