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 find
rufe 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::rwx
und default:mask::rwx
. Könnte das die Ursache des Problems sein?
Antwort1
Sehen Sie sich die Fehlerausgabe an: Sie sollten find: `…' Permission denied
Fehler sehen. Als Erstes entfernen Sie alle Zugriffsberechtigungen von , um eine weitere Rekursion zu verhindern. Außer dem allerersten wird $topdir
keiner 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::Find
anstatt das externe Programm aufzurufen find
. Verwenden Sie die finddepth
Funktion, 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 0750
oder was auch immer es sein soll. Die Verwendung von File::Find
gibt Ihnen mehr Flexibilität, z. B. Verzeichnisse und normale Dateien unterschiedlich zu behandeln.