Ответ 1
Короткая
Bash уже имеет дело с этим. Цитата достаточно.
ls "$INPUT"
Длинный
Грубое руководство к тому, как оболочка анализирует эту строку:
"ls \"$INPUT\"" # Raw command line.
["ls", "\"$INPUT\""] # Break into words.
["ls", "\"filename; rm -rf /\""] # Perform variable expansion.
["ls", "\"filename; rm -rf /\""] # Perform word splitting (no change).
["ls", "filename; rm -rf /"] # Remove quotes.
Из-за кавычек переменная $INPUT
не претерпевает расщепления слов. ls
будет искать файл с именем filename; rm -rf /
.
Если вы не процитировали его, расширение будет действовать по-другому:
"ls $INPUT" # Raw command line.
["ls", "$INPUT"] # Break into words.
["ls", "filename; rm -rf /"] # Perform variable expansion.
["ls", "filename;", "rm", "-rf", "/"] # Perform word splitting.
У вас может быть хотя бы утешение, что на самом деле это не будет выполняться rm -rf /
. Скорее, он передаст каждую из этих строк в качестве имени файла в ls
. Вы будете ls
некоторые файлы, которые вы не намеревались, но, по крайней мере, они не будут случайно выполнять нежелательные команды.
jkugelman$ VAR='.; echo hi'
jkugelman$ ls $VAR
ls: .;: No such file or directory
ls: echo: No such file or directory
ls: hi: No such file or directory
Выдержки из "man bash":
Цитирование
Цитата используется для удаления специального значения определенных символов или слов в оболочке. Цитирование может использоваться для отключения специальной обработки специальных символов, чтобы предотвратить сохранение зарезервированных слов как таковых и предотвратить расширение параметров.
РАСШИРЕНИЕ
Расширение выполняется в командной строке после того, как оно было разделено на слова. Существует семь видов выполнения расширения: расширение скобки, расширение тильды, расширение параметра и переменной, команда подстановка, арифметическое расширение, разбиение слов и расширение пути.
Только расширение расширений, расщепление слов и расширение пути могут изменять количество слов расширение; другие расширения расширяют одно слово до одного слова. Исключение составляют только разложения
"[email protected]"
и"${name[@]}"
, как объяснялось выше (см. ПАРАМЕТРЫ).Разделение слов
Оболочка сканирует результаты разложения параметров, подстановки команд и арифметического расширения которые не встречались в двойных кавычках для разбиения слов.
Удаление цитаты
После предыдущих расширений все некотируемые вхождения символов
\
,'
и"
, которые не результат одного из указанных выше расширений.