작업 중인 zsh 쉘 스크립트에 대한 일부 기본 변수를 저장하고 싶습니다. source
내 스크립트에서 한 줄을 사용하는 것이 효과가 있다는 것을 알고 있지만 가장 안전한 방법은 아닙니다.
모든 사용자에 대한 최대 호환성을 보장하기 위해 zsh(구체적으로 Amazon Linux 2)에서 기본적으로 제공되는 도구를 사용하여 텍스트 파일에서 행을 안전하게 읽고 구성 파일에서 사전 설정된 변수 세트를 추출하는 방법이 있습니까?
텍스트 파일 자체는 해시되지 않는다는 것을 알고 있지만 그건 내 문제가 아닙니다. 내 목표는 누군가가 구성 파일에 악성 코드를 삽입하고 이를 스크립트로 처리할 가능성을 피하는 것입니다.
답변1
zsh가 제공하는 문자열 조작 기능 외에 이를 용이하게 하는 zsh의 어떤 기능도 생각할 수 없습니다.매개변수 확장.
config
다음 은 다음 제약 조건을 사용하여 KEY=VALUE 행을 연관 배열로 구문 분석하는 일부 코드입니다 .
- 키에는 ASCII 문자, 숫자, 밑줄만 포함할 수 있습니다. 키는 숫자로 시작하거나 비어 있을 수 없습니다.
- 값에는 개행 및 널 바이트를 제외한 모든 바이트 문자열이 포함될 수 있습니다. 여기에는 UTF-8과 같은 멀티바이트 인코딩에 잘못된 시퀀스가 포함될 수 있습니다.
- 빈 줄(ASCII 가로 공백만 포함하는 줄)과 주석 줄(공백 및 a로 시작하는 줄
#
)은 무시됩니다. - 어떤 종류의 확장도 없습니다. 변수 대체도 없고, 인용도 없고, 공백 제거도 없습니다.
function parse_config {
emulate -LR zsh
setopt extended_glob
local n=0 line lines
local LC_ALL=C
lines=("${(@f)$(<$1)}")
for line in "${(@)lines}"; do
((++n))
line=${line##[$' \t']##}
if [[ -z $line || $line == \#* ]]; then
continue
elif [[ $line = *$'\0'* ]]; then
echo >&2 "$1:$n:Null character in configuration file"
config=()
return 1
elif [[ $line == [A-Z_a-z][0-9A-Z_a-z]#\=* ]]; then
config[${line%%=*}]=${line#*=}
else
echo >&2 "$1:$n:Syntax error in configuration file"
config=()
return 1
fi
done
}
다음 함수를 호출하세요.
set -e
typeset -A config
parse_config /path/to/config/file
echo "Configuration dump:"
for k in ${(ko)config}; do
print -lr "$k=$config[$k]"
done