Nun, um genau zu sein, war es chmod -R 755
. Jetzt ist jede Datei ausführbar, was ich nicht will. Ich denke, ich sollte die ersten zwei Bytes jeder Datei nach dem durchsuchen #!
, aber wird dies alles abdecken? Soll ich stattdessen file
alles ansehen und meine Entscheidung darauf stützen? Oder gibt es wahrscheinlich einen noch besseren Weg, dies zu tun?
Was ist die bevorzugte Methode, um ein Verzeichnis rekursiv zu durchlaufen und -x für Dateien festzulegen, die nicht ausführbar sein sollen?
permissions
files
chmod
Larry Wang
quelle
quelle
/
oder einem anderen Verzeichnis gemacht?/
, ein Verzeichnis, das sich vollständig in meinem Besitz befindet.Antworten:
Hier gibt es kein Wundermittel. Die Berechtigungen enthalten Informationen, die nicht immer redundant sind.
Wenn Sie dies in einem Systemverzeichnis getan hätten, wäre Ihr System in einem sehr schlechten Zustand, da Sie sich um setuid- und setgid-Bits sowie um Dateien sorgen müssten, die nicht für die ganze Welt lesbar sein sollen, und um Dateien das soll gruppen- oder weltschreibbar sein.
In einem Benutzerverzeichnis müssen Sie sich um Dateien kümmern, die nicht für die ganze Welt lesbar sein sollen. Da kann dir niemand helfen.
Was die Ausführbarkeit betrifft, ist es eine gute Faustregel, alles, was nicht so aussieht, als ob es ausgeführt werden könnte, nicht ausführbar zu machen. Der Kernel kann Skripte , deren ersten beiden Bytes sind ausführen
#!
, ELF - Binärdateien , deren ersten vier Bytes sind ,\x7fELF
wo\x7f
ist das Byte mit dem Wert 12, und einige seltenere Dateitypen (a.out, alles registriertbinfmt_misc
). Daher sollte der folgende Befehl Ihre Berechtigungen in einen vernünftigen Zustand zurückversetzen (setzt bash 4 oder zsh voraus, andernfalls wird erfind
zum Durchlaufen des Verzeichnisbaums verwendet; Warnung, direkt in den Browser eingegeben):Beachten Sie, dass es eine einfache Möglichkeit gibt, die Berechtigungen eines Verzeichnisbaums unter Linux und möglicherweise anderen Unices mit ACL-Unterstützung zu sichern und wiederherzustellen:
quelle
**/*
erforderlich istglobstar
.find
Erstens , benutze lieber Globstar als Globstar; Zweitens: Anstatt auf den Kopf zu schauen, verwenden Sie denfile
Befehl, um zu sehen, was er ist, und verzweigen Sie von dort.find
ist weniger zuverlässig alsglobstar
,globstar
ist in fast jedem Fall vorzuziehen.Ich glaube, Sie werden so etwas wollen
find dir -type f -exec chmod ugo-x '{}' +
Dadurch werden alle regulären Dateien rekursiv in dir gesucht (Verzeichnisse und Geräte werden ausgeschlossen) und das ausführbare Bit entfernt.
Ich würde hier anfangen und mich dann bemühen, Dateien zu erstellen, die ausführbar und ausführbar sein sollen.
Das Folgende sollte genau so funktionieren, wie Sie es gewünscht haben (es werden alle regulären Dateien gefunden, nach # gegriffen! Und dann die x-Bits entfernt, wenn sie nicht gefunden wurden)
möglicherweise eine bessere Version des oben genannten (weniger Rohre)
quelle
grep -L '^#!'
zumindest so ein (die Anführungszeichen sind erforderlich und^
beschränken sich auf die Übereinstimmung am Zeilenanfang), aber es ist immer noch zu tolerant, da es#!
in jeder Zeile übereinstimmt . Beixargs
Dateinamen, die Leerzeichen oder Anführungszeichen enthalten, schlägt die Verwendung fehl. usexargs -d '\n'
(benötigt GNUxargs
).Nun, ohne eine Shebang-Zeile wird die Datei als Shell-Skript ausgeführt, nominal mit
/bin/sh
. Ihre Idee ist ein guter Anfang, und unter der Annahme, dass das fragliche Verzeichnis keine geschäftskritischen Dateien enthält, besteht wahrscheinlich kein großes Risiko für die Ausführung einigergrep
undchmod
kombinierter Dateien . Es kann vorkommen, dass Sie auf falsch positive Ergebnisse stoßen, dh auf Dateien mit einer Shebang-Zeile, deren ausführbares Bit nicht gesetzt sein soll. Sie können jedoch entscheiden, ob dies eine erhebliche existenzielle Bedrohung für Sie darstellt System und / oder Daten.quelle
#!
.