O uso eval
geralmente é desencorajado, pois permite a execução de código arbitrário. No entanto, se usarmos eval echo
, parece que o restante da string se tornará um argumento, echo
portanto deve ser seguro. Estou correto nisso?
20
-n
, pode fazê-lo com uma variável não citada comoecho $arguments
ou se$arguments
é uma matrizecho "${arguments[@]}"
. Usareval echo
é inútil, mesmo que fosse seguro.Respostas:
Contraexemplo:
Os argumentos arbitrários para
echo
poderiam ter feito algo mais nefasto do que criar um arquivo chamado "foo".fonte
DANGEROUS="hello;ls"
:, para comandos arbitrários no lugar dels
.DANGEROUS='$(ls)'
(pode ser necessário mais escape).eval echo '"'"$DANGEROUS"'"'
? Parece que em goo.gl/L2pPQPDANGEROUS='">foo"'
).@Celada forneceu uma excelente resposta. Para demonstrar
eval
é realmente ruim, aqui está algo mais nefasto do que criar um arquivo chamado "foo" :E é claro que pode haver algo mais nefasto do que algo mais nefasto do que criar um arquivo chamado "foo" .
fonte
"$THIS"
vez de apenas tê-la como$THIS
isso nem ajuda!eval echo '"'"$DANGEROUS"'"'
. Tente em goo.gl/L2pPQP>foo
, porque "criar um arquivo chamado 'foo'" não é necessariamente tudo o que>foo
faz. A única diferença real que seu exemplo tem é que ele não deixa um arquivo vazio para trás. O conteúdo ainda se foi.Não, nem sempre é seguro. Uma avaliação pode executar qualquer comando.
Um comando seguro, como este (a data não é executada, pois está entre aspas simples):
Torna-se perigoso se usado com eval:
Claro, a data pode ser qualquer comando.
Uma maneira de melhorar isso é citar adicionalmente os argumentos para avaliar:
Mas geralmente é difícil citar corretamente duas vezes uma expressão.
E torna-se impossível controlar a citação correta se a expressão puder ser definida por um invasor externo, como:
fonte
Embora seja verdade que
eval
sempre precisa ser abordado com cautela, aeval echo
construção nem sempre é inútil e pode ser usada com segurança. Recentemente, eu precisava dele para obter várias expansões de chaves avaliadas na ordem em que eu precisava.bash
faz várias expansões de braçadeira da esquerda para a direita,expande para
mas eu precisava da segunda expansão de braçadeira feita primeiro, produzindo
O melhor que eu pude fazer para isso foi
Isso funciona porque as aspas simples protegem o primeiro conjunto de chaves da expansão durante a análise da
eval
linha de comando, deixando-as serem expandidas pelo subshell invocado poreval
.Pode haver algum esquema astuto envolvendo expansões de chaves aninhadas que permita que isso aconteça em uma única etapa, mas se houver, sou velho e estúpido demais para vê-lo. Também existem outras conchas
bash
que permitem maneiras mais organizadas de alcançar esse tipo de coisa. Mas, em qualquer caso, esse uso deeval
é seguro porque seus argumentos são todos cadeias fixas que não contêm expansões de parâmetro.fonte
eval xargs -I_ cat _/'{11..15}'/{8..5}.jpg