Este é o mesmo processo que em "execute qualquer comando que passe dados não confiáveis a comandos que interpretam argumentos como comandos" .
Seu primeiro comando,
bash -c "ls \" bash '.; echo hello'
é processado da seguinte forma:
-
bash
é executado com os argumentos-c
,ls $1
,bash
,.; echo hello
. o bash lê seus argumentos, observa a opção-c
com o comandols $1
e os argumentos extrasbash
e.; echo hello
; -
quando o bash expande
ls $1
, ele expande parals
com os argumentos.;
,echo
,hello
e executa isso.
O ponto e vírgula teria que ser processado antes da expansão da variável para fazer com que o bash executasse dois comandos diferentes.
Seu segundo comando,
bash -c "eval ls \" bash '.; echo hello'
é processado da seguinte forma:
-
bash
é executado com os argumentos-c
,eval ls $1
,bash
,.; echo hello
. o bash lê seus argumentos, observa a opção-c
com o comandoeval ls $1
etc. -
após a expansão, ele executa
eval
com os argumentosls
,.;
,echo
,hello
;
Em seguida, -
eval
faz com que os argumentos sejam analisados novamente, resultando na execução dels .
seguido porecho hello
.