2

Мне нужно найти все файлы в каталоге, где совпадают группы и другие разрешения (например, те, в которых членство группы в файле на самом деле не влияет на доступ).

Так как для этого есть только 8 возможностей (x00, x11, x22 и т.д.) Я думал, что могу просто искать по этим разрешениям, но не могу найти способ явно сопоставить некоторые биты разрешений, не сопоставив их все (например, сопоставить все 000, 100, 200, 300 и т.д. Для x00).

Я построил длинное выражение для поиска:

find . \( \ -perm 000 -o -perm 011 -o -perm 022 -o -perm 033 [...] \ -perm 100 -o -perm 111 -o -perm 122 -o -perm 133 [...] \ [...] \) -ls

И это работает, но кажется, что это очень не элегантно (это более 8 символов ... и это до того, как я поместил какие-либо предложения по выбору пути, которые понадобятся ...).

Есть ли способ лучше?

Изменить: мне просто пришло в голову, что это игнорирует разрешения SUID/SGID. Добавление их сделает команду еще длиннее ... надеюсь, есть лучший способ!

1 ответ1

0

Ну, я все еще не уверен, что понимаю проблему (вероятно, не ваша вина!), Но вот несколько идей:

1) Используйте опцию -print0 команды find (и аналогичные опции в grep , xargs и т.д.) Для работы со специальными символами в именах файлов.

2) Может потребоваться некоторый сценарий foo, чтобы собрать все это вместе, но команда stat вернет восьмеричную строку разрешения для файла. Затем все, что вам нужно сделать, это разбить его на три отдельных символа (например, 775 -> 7 7 5) (используя модификаторы параметров bash или обработку строк на выбранном вами языке / инструменте), и если второй или третий символ соответствует сначала один, затем у вас есть идентичные разрешения для владельца и группы или других.

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

У меня нет времени, чтобы выяснить детали, но я бы начал с того, что смогу написать сценарий, который бы:

1) Получите и разбейте разрешения, используя stat а затем проверьте, есть ли совпадения разрешений. Если есть, напечатайте имя файла (возможно, полный путь) и разрешения или флаги для того, что нужно изменить. Если нет, просто отмените это имя файла.

2) Либо направьте вывод find в этот скрипт, либо получите доступ к нему с помощью опции find -exec .

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .