Chcę znaleźć pliki, których dany użytkownik nie będzie w stanie odczytać.
Załóżmy, że nazwa użytkownika to „użytkownik123” i należą do grupy o nazwie „użytkownik123”. Chcę znaleźć pliki, które, jeśli są własnością użytkownika123, mają włączoną funkcję u + r; w przeciwnym razie, jeśli plik należy do grupy user123, powinien mieć włączony g + r; w przeciwnym razie może mieć włączone o + r.
Ponieważ GNU find ma opcję „-readable”, mógłbym to zrobić:
sudo -u user123 find /start ! -readable -ls
Jednak proces musi być uruchamiany przez użytkownika, który nie ma dostępu do sudo. Dlatego próbowałem tego: (nie sprawdza o + r, ale w tym momencie nie jest to ważne)
find /start \( -user user123 ! -perm -u=r \) -o \( -group user123 ! -perm -g=r \) -ls
ale wyświetla ten plik:
272118 4 -rw------- 1 user123 user123 3243 Jul 3 19:50 /start/blah/blah/file.txt
Ten plik jest jedynym plikiem /start
należącym do użytkownika123 przy g=r
wyłączonym. To tak, jakby find interpretuje -u=r
jako -g=r
.
Postanowiłem spróbować odwrócić logikę i zamiast tego przetestować not ( truth )
:
find /etc/puppet ! \( \( -user puppet -perm -u=r \) -o \( -group puppet -perm -g=r \) -o \( -perm -o=r \) \) -ls
To działa!
Dlaczego oryginał find
zawiódł? Czy to błąd find
(mało prawdopodobne), czy logika jest zła?
Aktualizacja: pomyliłem logikę. Jak wskazano poniżej, ponieważ! (A || B || C) == (! A &&! B &&! C) są to dwa równoważne stwierdzenia:
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
Moim celem nie było dwukrotne testowanie użytkownika / grupy. To, czego naprawdę potrzebuję, to bardziej skomplikowana struktura „jeśli to wtedy”, która prawdopodobnie byłaby możliwa tylko wtedy, gdyby istniał operator -xor. Mógłbym zbudować xor z i / lub / nie, ale byłoby to bardziej złożone niż dwa powyższe rozwiązania.
puppet
ma dostęp do pliku za pomocą--wxrwxrwx puppet puppet
.