Я хочу найти файлы, которые конкретный пользователь не сможет прочитать.
Предположим, что имя пользователя «user123», и они находятся в группе под названием «user123». Я хочу найти файлы, которые, если они принадлежат user123, имеют u + r; в противном случае, если файл является группой user123, он должен иметь 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=roff. Это как если бы найти интерпретирует -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.