Digamos que eu tenha um script bash que atue como um arquivo de configuração para outro script bash:
configuração.sh:
verbose=yes
echo "Malicious code!"
name=test
script.sh:
source config.sh
echo "After sourcing: verbose='$verbose', name='$name'"
O problema é que isso não é muito seguro, pois qualquer coisa colocada em config.sh é executada:
$ ./script.sh
Malicious code!
After sourcing: verbose='yes', name='test'
Para torná-lo mais seguro, pensei em realizar operações de atribuição e apenas executá-las. Eu conseguiria passar source
um "documento aqui":
script.sh:
source <<EOF
$(grep -P '^\s*\w+=' test.sh)
EOF
echo "After sourcing: verbose='$verbose', name='$name'"
(Sim, eu sei que o regex não é tão forte; é apenas um espaço reservado.) Infelizmente, a fonte não parece funcionar bem com os documentos aqui:
./script.sh: line 1: source: filename argument required
source: usage: source filename [arguments]
After sourcing: verbose='', name=''
Obviamente, eu poderia fazer várias coisas para obter dados de configuração de um arquivo, e isso provavelmente é mais seguro de qualquer maneira.
Mas ainda estou com essa coceira; Quero descobrir se o que tentei pode funcionar. Alguma sugestão?
Responder1
source <(cat << EOF
A=42
EOF
)
echo $A
Saída:
42
Responder2
source
precisa de um nome de arquivo, você não pode redirecionar a entrada para ele.
No meu sistema, consegui usar a substituição de processo:
source <( grep = test.sh )
Substitua =
pela expressão regular apropriada.
Responder3
Você pode diretamente eval
:
eval "$(grep -P '^\s*\w+=' config.sh)"
#quotes needed if you want the full content of the file (including newlines etc.)
A fonte é essencialmente a mesma que:
eval "$(cat file)"
Observe, entretanto, que as pessoas poderiam estar executando todos os tipos de codez no lado direito do sinal de igual:
a=$(evil_code_here)
b=`evil_code_here`
c="something" evil_code_here
#etc.
Você precisa de um filtro melhor.