Я хочу знайти файли, які певний користувач не зможе прочитати.
Припустимо, ім’я користувача "user123", і вони знаходяться в групі під назвою "user123". Я хочу знайти файли, які, якщо вони належать користувачу123, мають i + r; якщо цього файлу є груповий користувач123, він повинен мати g + r; якщо це не може, він може мати o + r.
Оскільки GNU find має "читабельний", я можу це зробити:
sudo -u user123 find /start ! -readable -ls
Однак процес повинен запускати користувач, який не має доступу до sudo. Тому я спробував це: (він не перевіряє o + r, але це не важливо на даний момент)
find /start \( -user user123 ! -perm -u=r \) -o \( -group user123 ! -perm -g=r \) -ls
але він містить цей файл:
272118 4 -rw------- 1 user123 user123 3243 Jul 3 19:50 /start/blah/blah/file.txt
Цей файл є єдиним файлом, у /start
якому належить user123 з g=r
вимкнено. Це ніби знахідка тлумачить -u=r
як -g=r
.
Я вирішив спробувати змінити логіку і замість цього випробувати not ( truth )
:
find /etc/puppet ! \( \( -user puppet -perm -u=r \) -o \( -group puppet -perm -g=r \) -o \( -perm -o=r \) \) -ls
Це працює!
Чому оригінал find
провалився? Це помилка find
(малоймовірна) чи логіка неправильна?
Оновлення: я помилився з логікою. Як було зазначено нижче, оскільки! (A || B || C) == (! A&&! B&&! C) - це два еквівалентні твердження:
find /start ! \( \( -user user123 -perm -u=r \) -o \( -group user123 -perm -g=r \) -o \( ! \( -user user123 -o -group user123 \) -perm -o=r \) \) -ls
find /start ! \( -user user123 -perm -u=r \) ! \( -group user123 -perm -g=r \) ! \( ! \( -user user123 -o -group user123 \) -perm -o=r \) -ls
Моєю метою було не двічі перевіряти користувача / групу. Що мені справді потрібно - це більш складна структура if-then-else, яка, ймовірно, була б можливою лише за наявності оператора -xor. Я міг би створити xor з та / або / ні, але це було б складніше, ніж два рішення, наведені вище.
puppet
мати доступ до файлу з--wxrwxrwx puppet puppet
.