Ich möchte Dateien finden, die ein bestimmter Benutzer nicht lesen kann.
Angenommen, der Benutzername ist „user123“ und sie befinden sich in einer Gruppe namens „user123“. Ich möchte Dateien finden, die, wenn sie dem Benutzer 123 gehören, u + r aktiviert haben. Andernfalls sollte g + r aktiviert sein, wenn die Datei die Gruppe user123 ist. andernfalls kann es o+r on haben.
Da GNU find „-readable“ hat, könnte ich das 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 wird nicht überprüft, 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 Benutzer 123 mit g=r
gehört aus. Es ist, als würde find den -u=r
interpretieren als -g=r
.
Ich beschloss, die Logik umzukehren und stattdessen not ( truth )
zu testen stattdessen:
find /etc/puppet ! ( ( -user puppet -perm -u=r ) -o ( -group puppet -perm -g=r ) -o ( -perm -o=r ) ) -ls
Das funktioniert!
Warum wurde das Original find
scheitern? Ist es ein Fehler in find
(unwahrscheinlich) oder ist die Logik falsch?
Aktualisierung: Ich hatte die Logik falsch. Wie unten ausgeführt, seit
! ( A || B || C ) ==( !A &&!B &&!C )
Dies sind die beiden äquivalenten Anweisungen:
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/Gruppen nicht zweimal testen zu müssen. Was ich wirklich brauche, ist eine kompliziertere if-then-else-Struktur, die wahrscheinlich nur möglich wäre, wenn es einen -xor-Operator gäbe. Ich könnte ein xor aus and/or/not bauen, aber es wäre komplexer als die beiden obigen Lösungen.
Akzeptierte Antwort:
Die Logik ist falsch. Sie denken, diese Datei hätte nicht aufgelistet werden sollen, weil sie user123
gehört und hat den r
des Benutzers Bit gesetzt. Es wird jedoch aufgelistet, weil es das zweite Kriterium erfüllt (es gehört der Gruppe user123
und hat den r
der Gruppe etwas ungesetzt).
Ihre zweite Version funktioniert aufgrund eines der Gesetze von de Morgan:Das Negieren der logischen ODER-Verknüpfung einer Gruppe von Anweisungen ist logisch äquivalent zur UND-Verknüpfung der Negation der einzelnen Anweisungen. Mit anderen Worten:
! ( A || B || C ) == ( !A && !B && !C )
Also das funktionierende find
sucht nach einer Datei, die
- Ist nicht (im Besitz von Benutzer
user123
und von diesem Benutzer lesbar) UND - Ist nicht (gehört der Gruppe
user123
und von dieser Gruppe lesbar) UND - Ist nicht weltweit lesbar.
während der erste find
sucht nach einer Datei, die
- Ist im Besitz von Benutzer
user123
und für diesen Benutzer nicht lesbar sind ODER - Gehört der Gruppe
user123
und nicht lesbar für diese Gruppe ODER (wenn Sie es ausgefüllt hätten) - Ist nicht weltweit lesbar
Eine Datei, die IRGENDEINEM der oben genannten 3 Kriterien (und nicht notwendigerweise allen) entspricht, würde also so aufgelistet werden, wie Sie es gesehen haben.
Bearbeiten
Übrigens (nachdem ich dein Profil angesehen habe) bin ich ein großer Fan deines O’Reilly-Buchs 🙂