2012-06-01 2 views
2

Привет Я работаю в среде Linux, и я пытаюсь написать команду, которая примет путь как входной и выведет список всех пользователей с доступом для чтения к этому файл/каталог.Создайте список пользователей с доступом для чтения к файлам

Например, если файл/a/b/c принадлежит файлам userid, u и groupid, g, с некоторыми разрешениями, я хочу, чтобы эта команда идентифицировала разрешения/a и/a/b, а затем вычислила все пользователи, которые могут читать c. В частности, у меня возникают проблемы, когда группы участвуют.

Я пытаюсь отделить идентифицирующую читать доступа на основе от группы в случаях:

1) г совпадает с GID С в родительской GID, гп, (или прародителя, и т.д ..), в этом случае, любой член of g может читать c, если gp имеет разрешение: 040 или менее ограничительное.

2) g отличается от g, g. Два подслучата:

... a) userid m является членом g (для всех m в g (m не принадлежит c)) и владеет родителем c, p. Тогда m может читать c, если p имеет разрешение: 400 или менее ограничительное.

... b) userid m является членом g (для всех m в g c c (m не принадлежит c)) и не имеет родителя c, p. Тогда m может читать c, если p имеет разрешение: 004 или менее ограничительное.

3) u владеет p, и в этом случае p нуждается в разрешениях 400 или менее ограничительных.

Кстати, у меня есть root доступ к этой системе. Я предполагаю, что мне придется сделать серию кошек в/etc/group и/etc/passwd и grep для получения соответствующей информации, и это нормально. Кроме того, в этой среде мы можем рассматривать «stat» бесплатно (это часть более крупного проекта, где у нас уже есть эта информация).

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

ответ

2

Я думаю, лучшим решением является следующее:

1.) Определите разрешение с.

if(b does not have a minimum of world execute bit settings) i.e. 711 
     return error; (or owner && root) 
     // you can easily extend this check to recursively work back to/
if (c has global read permissions) 
     return everyone; 
else if (c has group read permissions) 
     determine group name && return all members of said group 
else (return owner && root) 

2.) Определение членов указанной группы может быть выполнено с использованием гена. например: getent group - возвращает все группы в системе getent passwd - возвращает всех пользователей 3.) Разрешения могут быть определены с помощью «stat c» или чего-то подобного.

1

cat ing имеет недостатки; вместо этого используйте getent. Не забудьте проверить ACL.

+1

И не забудьте проверить обход каталога до корня. –

Смежные вопросы