Как пользователи могут запускать файл без разрешения?

Другой вариант в bash, предполагающий, что у вас не так много совпадающих имен файлов, что вы бы превышали $(getconf ARG_MAX), состоял бы в том, чтобы перебрать расширение **в globstar и создать массив имен файлов, которые матч:

shopt -s globstar
matching_files=()
for entry in **
do
  [ -f "$entry" ] || continue
  grep -q 'pattern' -- "$entry" && matching_files+=("$entry")
done
vi -- "${matching_files[@]}"

Цикл найдет не -скрытые файлы и каталоги в текущем каталоге и под ним; первый тест, который мы делаем, - это посмотреть, есть ли у нас простой файл. Если это так, мы запускаем тихий/молчаливый grepпротив него для желаемого паттерна. Если файл содержит шаблон, мы добавляем его имя в соответствующий массив _файлов. В конце мы запускаем viдля безопасного -расширенного списка записей в массиве.

Если вы также хотите искать скрытые файлы и каталоги, установите shopt -s dotglob.

11
30.05.2020, 22:07
1 ответ

Очень короткая версия: :вы не выполняете файл. Вы читаете его в оболочку, которая затем выполняет его.

Обратите внимание, что некоторые языковые интерпретаторы проверяют разрешения на выполнение файла, который им предлагается выполнить, и отказываются делать это, если у пользователя нет соответствующих разрешений. Но это полностью дискреционная проверка автора этого конкретного интерпретатора, и она не применяется операционной системой.

Давайте проведем небольшой мысленный эксперимент.

Я думаю, мы оба можем согласиться, что если программа имеет разрешения на выполнение, мне должно быть разрешено выполнять эту программу. Я думаю, мы также можем согласиться с тем, что этой программе следует разрешить выводить на консоль строку «Hello World».

Кроме того, мы, вероятно, также можем согласиться с тем, что программа должна иметь возможность читать файл, если у этого файла есть разрешения на чтение. И на самом деле не имеет значения, каково содержание этого файла,пока файл имеет установленный бит разрешения на чтение, программе должно быть разрешено читать его.

Итак, поскольку мы договорились, что программе должно быть разрешено выводить «Hello World» на консоль, и мы согласились, что программе должно быть разрешено читать файл, логически вы также должны согласиться с тем, что программа должна разрешено читать файл и печатать «Hello World» на консоли. И мы также сказали, что разрешено ли программе читать файл, зависит от разрешений, а не от содержимого, поэтому ей также должно быть разрешено читать файл и печатать «Hello World» на консоли, если содержимое файла echo Hello World.

Теперь вы также можете согласиться с тем, что, поскольку программе разрешено читать файл и поскольку программе разрешено печатать «Hello World» на консоли, ей также разрешено проверять содержимое файла и только вывести «Hello World» на консоль, если содержимое файла echo Hello World?

Хорошо, но тогда это является "интерпретацией", другими словами выполнением файла, и вы только что согласились со мной на каждом этапе пути, что это должно быть разрешено сделать это!

Именно это здесь и происходит. Оболочка просто читает текстовый файл, что ей разрешено, потому что текстовый файл имеет права на чтение. И оболочка выполняет инструкции в текстовом файле, что ей разрешено делать, поскольку оболочка имеет разрешения на выполнение.

6
18.03.2021, 23:31

Теги

Похожие вопросы