Почему внедрение команд не работает в этом примере?

Почему команда впрыска не работает в

$ bash -c "ls \$1" bash '.; echo hello' ls: cannot access '.;': No such file or directory ls: cannot access 'echo': No such file or directory ls: cannot access 'hello': No such file or directory 

в то время как

 $ bash -c "eval ls \$1" bash '.; echo hello' 

работает?

В первой команде выполняет ли первая команда bash расширение параметра на $1 , разбиение слов на результат расширения $1 , а затем выполняет команды?

Благодарю.

Происходит от способа предоставления аргументов команде, выполняемой `bash -c`

связано с тем, почему это внедрение кода не работает?

Это тот же процесс, что и в «выполнить любую команду, которая передаст ненадежные данные командам, которые интерпретируют аргументы как команды» .

Ваша первая команда,

 bash -c "ls \$1" bash '.; echo hello' 

обрабатывается следующим образом:

  • bash работает с аргументами -c , ls $1 , bash , .; echo hello .; echo hello . bash считывает свои аргументы, отмечает параметр -c с командой ls $1 и дополнительные аргументы bash и .; echo hello .; echo hello ;

  • когда bash расширяет ls $1 , он расширяется до ls с аргументами .; echo hello и бегает

Точка с запятой должна была быть обработана до раскрытия переменной, чтобы bash запускал две разные команды.

Ваша вторая команда,

 bash -c "eval ls \$1" bash '.; echo hello' 

обрабатывается следующим образом:

  • bash работает с аргументами -c , eval ls $1 , bash , .; echo hello .; echo hello . bash читает свои аргументы, отмечает параметр -c командой eval ls $1 и т. д.

  • после раскрытия он запускает eval с аргументами ls , .; , echo , hello ;

  • Затем eval вызывает повторный анализ аргументов, что приводит к выполнению ls . с последующим echo hello .