GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Dateien finden, die ein Benutzer nicht lesen kann?

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.
Verwandte:Linux – Wie findet man bei einem gegebenen Git-Commit-Hash heraus, welche Kernel-Version ihn enthält?

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 🙂


Linux
  1. Alle Dateien erhalten, die an einem bestimmten Datum geändert wurden?

  2. Wie finde ich alle Dateien, die keine Textzeichenfolge enthalten?

  3. Größte Dateien rekursiv finden?

  4. Wie finde ich alle Dateien, die einem bestimmten Benutzer in Unix/Linux gehören?

  5. Wie kann ich xargs verwenden, um Dateien zu kopieren, deren Namen Leerzeichen und Anführungszeichen enthalten?

So finden Sie Dateien unter Linux

Finden Sie große Dateien in Linux

Linux – Kann ein einzelner Benutzer mehrere Crontab-Dateien haben?

Wie finde ich Textdateien, die keinen Text unter Linux enthalten?

Wie kann ich mit ls nur nicht leere Dateien auflisten?

Warum können „Andere“ Dateien standardmäßig in Ubuntu lesen?