Ich möchte Dateien finden, die ein bestimmter Benutzer nicht lesen kann.
Angenommen, der Benutzername lautet "user123" und sie befinden sich in einer Gruppe namens "user123". Ich möchte Dateien finden, die, wenn sie Eigentum von user123 sind, u + r aktiviert haben. Andernfalls sollte g + r aktiviert sein, wenn die Datei der Gruppe user123 ist. Andernfalls kann o + r eingeschaltet sein.
Da GNU find "-readable" hat, könnte ich dies tun:
sudo -u user123 find /start ! -readable -ls
Der Prozess muss jedoch von einem Benutzer ausgeführt werden, der keinen Sudo-Zugriff hat. Deshalb habe ich folgendes versucht: (es prüft o + r nicht, aber das ist an dieser Stelle nicht wichtig)
find /start \( -user user123 ! -perm -u=r \) -o \( -group user123 ! -perm -g=r \) -ls
aber es listet diese Datei auf:
272118 4 -rw------- 1 user123 user123 3243 Jul 3 19:50 /start/blah/blah/file.txt
Diese Datei ist die einzige Datei unter /start
, die dem Benutzer123 mit g=r
off gehört. Es ist, als würde find das -u=r
as interpretieren -g=r
.
Ich beschloss, die Logik umzukehren und stattdessen zu testen not ( truth )
:
find /etc/puppet ! \( \( -user puppet -perm -u=r \) -o \( -group puppet -perm -g=r \) -o \( -perm -o=r \) \) -ls
Das funktioniert!
Warum ist das Original find
gescheitert? Ist es ein Fehler find
(unwahrscheinlich) oder ist die Logik falsch?
Update: Ich hatte die Logik falsch. Wie unten ausgeführt, da! (A || B || C) == (! A &&! B &&! C) Dies sind die beiden äquivalenten Aussagen:
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
Mein Ziel war es, Benutzer / Gruppe nicht zweimal testen zu müssen. Was ich wirklich brauche, ist eine kompliziertere Wenn-Dann-Sonst-Struktur, die wahrscheinlich nur möglich wäre, wenn es einen -xor-Operator gäbe. Ich könnte ein xor daraus bauen und / oder / nicht, aber es wäre komplexer als die beiden obigen Lösungen.
puppet
Zugriff auf eine Datei mit hat--wxrwxrwx puppet puppet
.