Почему eval "ls -l $filename" опасна, если значение filename поступает от пользователя?
eval "ls -l $filename"
filename
eval повторно разбирает сформированную строку как код shell, поэтому ввод может добавить дополнительные команды.
eval
Команда read выполняет каждую строку до присваивания её переменной.
read
eval ограничивает строку аргументами ls, поэтому дополнительный синтаксис shell игнорируется.
ls
ls -l автоматически запускает whoami, если имя файла недействительно.
ls -l
whoami