다른 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.
더 나은 필터가 필요합니다.