-perm flag in find

Sep 05 2020

Ich versuche, meinen Kopf um diesen Befehl zu wickeln:

find /home/ -type d \( -perm -0002 -a ! -perm -1000 \) 2>/dev/null

Ich verstehe, dass es im 'Home'-Verzeichnis nach allen Verzeichnissen suchen und alle stderr-Nachrichten in eine Datei umleiten wird (um sie zu unterdrücken), aber ich bin durch den Teil in der Mitte verwirrt, insbesondere:

\( -perm -0002 -a ! -perm -1000 \)

Was bedeuten die Schrägstriche? Ich gehe davon aus ! -perm -1000, nach Verzeichnissen ohne diese Berechtigungen -perm -0002zu suchen und nach Verzeichnissen mit diesen Berechtigungen zu suchen, aber ich bin es nur gewohnt, Berechtigungen in der Form 644 (zum Beispiel) anzuzeigen. Warum gibt es vier Ziffern? Was macht die -aFlagge?

Antworten

4 netmonk Sep 05 2020 at 17:45

Im Handbuch finden Sie:

Operators
              Operators join together the other items within the expression.
              They include for example -o (meaning logical OR) and -a
              (meaning logical AND).  Where an operator is missing, -a is
              assumed.

Bedeutet also wörtlich \( -perm -0002 -a ! -perm -1000 \): perm = 0002 und nicht perm = 1000

perm = 0002 bedeutet beschreibbar für andere
perm = 1000 bedeutet, dass das Sticky-Bit gesetzt ist.

Dieser Ausdruck sucht also nach Dateien, die für Andere und ohne Sticky-Bit-Sets geschrieben werden können.

Die Suche nach einem Verzeichnis erfolgt mit -type d dmeans Verzeichnis. Suchen Sie also nach einem Objekt vom Typ Verzeichnis

Aus dem Suchhandbuch -permhat mehrere Formen:

  • -perm 0002 stimmt mit allen Dateien mit dieser genauen Berechtigungseinstellung überein
  • -perm -0002wird mit allen Dateien übereinstimmen, in denen dieses rechte Bit eingerichtet ist (was bedeutet 0772, 1752... welche Kombination auch immer, wenn die Datei für andere beschreibbar ist)
5 ilkkachu Sep 05 2020 at 22:23

In -type d \( -perm -0002 -a ! -perm -1000 \)zunächst entkommen die Schrägstriche die Klammer für die Schale, so dass sie als Argument übergeben werden können, statt von der Shell als speziellem Operator interpretiert. (Sie würden das gleiche beispielsweise >aus offensichtlichen Gründen benötigen .) Sie könnten als '('oder "("auch geschrieben werden, sehen aber schließlich findnur (und ).

Die Klammern gruppieren die Bedingungen und -asind eine und Konjunktion. Dies ist auch die implizite Standardeinstellung für aufeinanderfolgende Bedingungen, wie sie hier mit -type dund dem Ausdruck in Klammern verwendet werden. Es gibt keine explizite -aVerbindung zwischen ihnen. Der Ausdruck ist genau gleichbedeutend mit -type d -perm -0002 ! -perm -1000. Klammern werden wirklich nur in der oder Konjunktion benötigt -o.

-type dist offensichtlich und bedeutet, nach einer Datei zu suchen, bei der alle Berechtigungsbits gesetzt sind. Oder in diesem Fall Verzeichnisse, bei denen die Berechtigung zum Schreiben für andere festgelegt ist ( ) und das Sticky-Bit ( ) nicht festgelegt ist (aufgrund der Negation). Ich denke, die Kombination hier könnte auch so geschrieben werden . Beachten Sie den Bindestrich vor der Berechtigungszeichenfolge. Ohne ihn wäre die Bedeutung anders. Suchen Sie beispielsweise in der Linux-Manpage nach "(expr)" und "-perm mode".-perm -NNNNNNNN00021000-perm -o+w ! -perm -o+t

Der Schreibzugriff auf ein Verzeichnis ermöglicht das Erstellen, Entfernen und Umbenennen von Dateien darin, und das Sticky-Bit verhindert das Entfernen und Umbenennen von Dateien, die anderen Benutzern gehören. Der gesamte Ausdruck sucht nach Verzeichnissen, in denen jeder Dateien entfernen oder umbenennen kann.

2 binarysta Sep 05 2020 at 17:47
  • -a: ist logisches UND ( -okann für ODER verwendet werden)
  • \(, \): Da Klammern in der Shell eine besondere Bedeutung haben, wird der Schrägstrich verwendet, um sie zu umgehen
  • vierstelliger Berechtigungen beziehen sich auf sticky bit, setuid,setgid