chmod erlaubt Schreiben, wenn ich es nicht einstelle

chmod erlaubt Schreiben, wenn ich es nicht einstelle

Ich habe ein Perl-Skript, das Berechtigungen systematisch ändert. Als erstes entfernt das Skript alle Berechtigungen. Dies geschieht durch einen Aufruf chmod(von Perl aus). Ich habe dies getan, da ich festgestellt habe, dass das gesetzte GUID-Bit nicht gelöscht werden konnte, wenn ich es nicht explizit löschte:

system('find',
        $topdir,
        '-exec', 'chmod', 'u-swrx,g-swrx,o-swrx', '{}', ';'
);

Ich lege unterschiedliche Berechtigungen für Gruppen und Verzeichnisse fest. Mit findrufe ich es aus Perl wie folgt auf (in diesem Fall für Verzeichnisse):

system(
    'find',
    $topdir,
    '-type', 'd',
    '-exec', 'chmod', 'g=rx', '{}', ';'
  );

Obwohl ich jetzt nur rx eingestellt habe, scheinen die Skripte rwx zu haben, wenn ich die Dateiberechtigungen nach der Ausführung des Skripts überprüfe. Gibt es etwas, worauf ich achten sollte, da ich nicht ganz verstehe, warum das passiert; ich stelle es nirgendwo explizit ein. Ich stelle auch ACLs ein, aber sie verhalten sich alle wie erwartet. Das einzige Bemerkenswerte, das ich sehe, wenn ich mit getfacl überprüfe, ist mask::rwxund default:mask::rwx. Könnte das die Ursache des Problems sein?

Antwort1

Sehen Sie sich die Fehlerausgabe an: Sie sollten find: `…' Permission deniedFehler sehen. Als Erstes entfernen Sie alle Zugriffsberechtigungen von , um eine weitere Rekursion zu verhindern. Außer dem allerersten wird $topdirkeiner der erwarteten Befehle ausgeführt.chmod

Wenn Sie die Zugriffsberechtigung für alle Verzeichnisse in einem Baum entfernen möchten, müssen Sie dies von innen nach außen tun. Andernfalls können Sie, sobald Sie sich vom übergeordneten Verzeichnis abgekoppelt haben, nicht mehr rekursiv darauf zugreifen.

system('find',
        $topdir,
        '-depth',
        '-exec', 'chmod', 'u-swrx,g-swrx,o-swrx', '{}', ';'
);

Da Sie Perl verwenden, verwenden SieFile::Findanstatt das externe Programm aufzurufen find. Verwenden Sie die finddepthFunktion, um die richtige Durchlaufreihenfolge zu erhalten.

Es erscheint sinnlos, zwei Durchläufe durchzuführen. Führen Sie stattdessen einen einzigen Durchlauf durch und legen Sie die Dateiberechtigungen direkt auf den gewünschten Wert fest, z. B. chmod 0750oder was auch immer es sein soll. Die Verwendung von File::Findgibt Ihnen mehr Flexibilität, z. B. Verzeichnisse und normale Dateien unterschiedlich zu behandeln.

verwandte Informationen