Wie drückt man die Schreib- und Lesetests von „find“ aus, wenn sie nicht verfügbar sind?

Wie drückt man die Schreib- und Lesetests von „find“ aus, wenn sie nicht verfügbar sind?

Manchmal stelle ich auf alten Linux-Systemen fest, dass Tests , die prüfen, ob die Datei oder das Verzeichnis für den aktuellen Benutzer beschreibbar bzw. lesbar ist, findnicht unterstützt werden .-writable-readable

Angenommen, ich möchte ausdrücken -writable; dann -perm -0002wäre es nicht gleichwertig, da nicht geprüft wird, ob der Benutzer über Schreibberechtigung mittels Besitzer/Gruppe verfügt.

Wie kann ich findden -writableTest von mittels findanderer Tests von ausdrücken (zB -perm)?

Antwort1

Es gibt keinen bequemen Weg. Deshalb hat GNU Find hinzugefügt -readableund Freunde.

Sie können einen Ausdruck erstellen, der dem Berechtigungstest ähnelt, indem Sie die Gruppen aufzählen, denen der Benutzer angehört. Nicht getestet.

can_access="( -user $(id -u) -perm -0${oct}00 -o ("
for g in $(id -G); do
  can_access="$can_access -group $g -o"
done
can_access="${can_access% -o} ) -perm -00${oct}0 -o -perm -000${oct} )"
find … $can_access -print

Dies führt in manchen Fällen nicht zum richtigen Ergebnis, beispielsweise wenn Zugriffskontrolllisten vorhanden sind oder in Randfällen, wie etwa wenn -rw----r--einer Gruppe der Zugriff verweigert werden soll. Sie können die Randfälle mit derselben Technik wie oben prüfen, aber der Ausdruck wird noch komplexer. Für Zugriffskontrolllisten müssen Sie ein Tool aufrufen, das diese unterstützt.

Sprachen wie Perl und Python bieten einfachen Zugriff auf die access(2)Funktion und Funktionalität von find. In Perl mitFile::FindUnd-r/ -w/-x(die die effektive UID und GID des Perl-Prozesses verwenden — verwenden Sie -R/ -W/, -Xum mit der echten UID/GID wie zu prüfen access(2), und verwenden Sie diefiletest 'access'Pragmawenn Ihr Perl nicht zu alt ist, um Dinge wie ACL zu unterstützen):

use File::Find;
use filetest 'access';
find(sub { if (-r $_) { print "$_ is readable\n"; } }, '.');

In Python mitos.walkUndos.access(das die echte UID und GID des Python-Prozesses verwendet, wie etwa access(2)):

import os
for dirpath, dirnames, filenames in os.walk('.', ):
    for filename in filenames:
        filename = os.path.join(dirpath, filenames)
        if os.access(filename, os.R_OK):
            print(filename + ' is readable\n')

Der einzige absolut zuverlässige Weg ist, zu versuchen, die Datei zu öffnen. Dies erfordert ein externes Dienstprogramm und ist daher langsamer. So testen Sie die Lesbarkeit einer regulären Datei:

find … -exec sh -c 'exec 2>/dev/null; : <"$0"' {} \; …

Um die Schreibbarkeit zu testen, verwenden Sie : >>"$0"(dadurch wird die Datei zum Anhängen geöffnet, sodass es fehlschlägt, wenn die Datei nicht beschreibbar ist, es ändert aber nichts und aktualisiert insbesondere nicht die Änderungszeit). Um die Lesbarkeit eines Verzeichnisses zu testen, verwenden Sie ls -- "$0" >/dev/null. Um die Ausführbarkeit eines Verzeichnisses zu testen, verwenden Sie cd -- "$0". Es gibt keinen passiven Test für die Ausführbarkeit einer regulären Datei, für die Schreibbarkeit eines Verzeichnisses oder für den Zugriff auf die meisten nicht regulären Dateien.

verwandte Informationen