Wie entferne ich rekursiv Ausführungsberechtigungen aus Dateien, ohne Ordner zu berühren?

40

Ich habe ein Backup auf ein NTFS-Laufwerk erstellt, und nun, dieses Backup hat sich wirklich als notwendig erwiesen. Das NTFS-Laufwerk hat jedoch die Berechtigungen durcheinander gebracht. Ich möchte sie auf den Normalzustand zurücksetzen, ohne jede einzelne Datei manuell reparieren zu müssen.

Ein Problem ist, dass plötzlich alle meine Textdateien Ausführungsberechtigungen erhalten haben, was natürlich falsch ist. Also habe ich versucht:

sudo chmod -R a-x folder\ with\ restored\ backup/

Aber es ist falsch, da es die xErlaubnis auch aus Verzeichnissen entfernt , was sie unlesbar macht.

Was ist in diesem Fall der richtige Befehl?

Gaazkam
quelle
1
Meta: Ich habe nie verstanden, warum Unix-Systeme Dateien aus DOS- oder Windows-Dateisystemen das Ausführungsbit hinzufügen. Es ist nicht so, dass irgendjemand diese Dateien jemals ausführen würde. Im Allgemeinen füge ich meinen Mount-Optionen "noexec" hinzu, wo immer dies sinnvoll ist.
Edward Falk

Antworten:

68
chmod -R -x+X *

Das -xentfernt Ausführungsberechtigungen für alle
Das +Xfügt Ausführungsberechtigungen für alle hinzu, aber nur für Verzeichnisse.

Jak Gibb
quelle
2
Der Befehl, den ich letztendlich verwendet habe, um die normalen Berechtigungen wiederherzustellen: `chmod -R a-x + X, u-x + rwX, go-wx + rX Verzeichnis / Name`
gaazkam
3
Siehe auch Edwards Antwort zur Ausnahme für BSD
fikr4n
4
Die Anforderung "ohne Ordner zu berühren" wird dadurch nicht erfüllt. Was ist, wenn "execute" (möglicherweise für world) in einigen Verzeichnissen absichtlich entfernt wurde? Sie sollten es nicht hinzufügen.
Ben Voigt
4
Dies funktionierte nicht auf dem Mac. Wenn Sie das Flag -R an den Anfang verschieben, funktioniert dies sowohl auf Linux- als auch auf Mac-Terminals. chmod -R -x+x *
JoeMoe1984
2
In der richtigen Reihenfolge läuft es unter OSX, hat aber nicht den gewünschten Effekt. Sie müssen dies in zwei Schritten tun:chmod -R -x * && chmod -R +X *
Timmmm 10.10.18
14

Ok, ich habe die "chmod" -Manpages für Mac OS X, BSD und Linux noch einmal gelesen und ein paar Experimente durchgeführt. Folgendes habe ich über symbolische Modi gelernt. Es kann kompliziert werden, aber es lohnt sich zu verstehen:

  • Die allgemeine Form ist Klausel [, Klausel …], wobei:
  • Klausel : = [ugoa] [+ - =] [rwxXstugo]
  • [ugoa] ( who ) (mehrere angeben) bedeutet, dass die Berechtigung für Benutzer, Gruppen, andere oder alle festgelegt wird. Wenn nichts angegeben ist, ist der Standardwert 'a', aber die umask ist in Kraft.
  • [+ - =] ( Aktion ) (eine angeben) bedeutet:
    • + bedeutet, dass die angegebenen Berechtigungen zu den bereits gültigen Berechtigungen hinzugefügt werden
    • - bedeutet, dass die angegebenen Berechtigungen aus den bereits gültigen Berechtigungen entfernt werden
    • = bedeutet, dass die Berechtigungen auf die angegebenen Berechtigungen gesetzt werden und alle anderen gelöscht werden
  • [rwxXstugo] ( Berechtigung ) (geben Sie ein Vielfaches von rwxXst ODER eines von ugo an) legt die Berechtigungen für die angegebenen Benutzer wie folgt fest:
    • r - lesen
    • w - schreiben
    • x - ausführen / suchen
    • X - Ausführen / Suchen, wenn das Verzeichnis ODER ein Ausführungsbit bereits gesetzt wurde.
    • s - suid oder sgid
    • t - klebrig
    • u - Benutzerberechtigung kopieren
    • g - Gruppenberechtigung kopieren
    • o - andere Erlaubnis kopieren

So würde zum Beispiel a+xeine Datei von jedem ausführbar gemacht. a+Xwürde eine Datei für alle ausführbar machen, WENN sie für alle ausführbar gewesen wäre.

a+xwürde ein Verzeichnis für alle durchsuchbar machen. a+Xwürde auch ein Verzeichnis für alle durchsuchbar machen.

Der Hauptunterschied zwischen BSD und Linux besteht darin, dass bei BSD die Ermittlung auf der Grundlage der Berechtigungen der Datei erfolgt, bevor chmod ausgeführt wurde. Unter Linux erfolgt die Ermittlung unmittelbar vor der Ausführung der + X-Klausel.

Mit BSD a-x,a+Xwürde die Kombination die Ausführungs- / Suchberechtigung entfernen und dann ein Verzeichnis für alle durchsuchbar machen und eine Datei für alle ausführbar machen, wenn sie ursprünglich für alle ausführbar gewesen wäre.

a-x,a+XWürde unter Linux die Ausführungs- / Suchberechtigung entfernen und dann ein Verzeichnis für alle durchsuchbar machen, während eine Datei für niemanden ausführbar bleibt.


Hier ein konkretes Beispiel: Auf einer BSD-Maschine: Ein Verzeichnis, eine ausführbare Datei und eine nicht ausführbare Datei:

drwxr-x---  2 falk  staff  68 Jul 19 18:01 fee/
-rwxr-x---  1 falk  staff   0 Jul 19 18:01 fie*
-rw-r-----  1 falk  staff   0 Jul 19 18:01 foe

Beachten Sie, dass sowohl das Verzeichnis als auch "fie" vom Benutzer ausführbar / durchsuchbar sind, jedoch nicht von anderen.

Jetzt führen wir aus chmod a-x,a+X *. Die erste Klausel entfernt das Ausführungs- / Suchbit von allen Benutzern für alle Dateien, die zweite Klausel fügt es jedoch für "fee" und "fie" wieder hinzu. "fee", weil es sich um ein Verzeichnis handelt, und "fie", weil es zu Beginn mindestens ein ausführbares Bit enthält.

drwxr-x--x  2 falk  staff  68 Jul 19 18:01 fee/
-rwxr-x--x  1 falk  staff   0 Jul 19 18:01 fie*
-rw-r-----  1 falk  staff   0 Jul 19 18:01 foe

Ich hatte das gleiche Ergebnis ausgeführt chmod -x+X.

Fazit: Jak Gibbs Lösung wird unter Linux funktionieren, aber für BSD müssten Sie zwei Durchgänge durchführen.

Ich habe dies nicht auf SVr4 oder anderen Unix-Varianten getestet.

Edward Falk
quelle
Schön gelesen. Vielen Dank für die Recherche.
Jak Gibb
10

Ein Weg, es zu tun:

find backup -type f -exec chmod 0644 {} +
Satō Katsura
quelle
6
Dies kann dazu führen, dass Berechtigungen hinzugefügt oder entfernt werden, die Sie nicht ändern möchten. Besser zu bedienenchmod a-x {}
Edward Falk
1
@EdwardFalk chmod a-x {}kann auch Berechtigungen entfernen, die Sie nicht ändern möchten, und es kann dazu führen, dass Dateien nicht mehr schreibgeschützt sind. Der Punkt ist, 0644 ist ein "allgemein vernünftiger" Kompromiss. Das OP sollte natürlich auch das Gehirn einbeziehen, bevor Lösungen aus dem Internet auf seinen Computer angewendet werden.
Satō Katsura
4
"ax" entfernt die Ausführungsberechtigung für Benutzer, Gruppe und andere und lässt die anderen Berechtigungen meines Wissens unverändert. Habe ich das falsch gemacht?
Edward Falk
1
@EdwardFalk Nein, du hast recht. Aber Sie wissen nicht, was der Dateisatz wirklich ist, und Sie wissen auch nicht, wie die Berechtigungen vorher chmodlauten. Wenn die Sicherungsdateien Skripte und Binärdateien enthalten, ist das Entfernen xvon Skripten falsch. Wenn die Berechtigungen vorher chmod0777 sind, chmod a-xwerden sie trotzdem 0666 belassen, was wahrscheinlich nicht das ist, was Sie wollen. Ich sage, das chmod 0644ist eine bessere Heuristik, nicht das chmod a-xist falsch.
Satō Katsura
1
@NajibIdrissi Außer wenn Sie wissen, dass sie auf 0777 geändert wurden, als Sie sie in ein fremdes Dateisystem kopierten, das keine UNIX-Berechtigungen hat. Welches ist genau das, was der OP tat.
Satō Katsura
6
 find backup ! -type l ! -type d -exec chmod a-x {} +

Entfernt die Ausführungsberechtigung für Dateien, die nicht vom Typ Verzeichnis (wie von Ihnen angefordert) oder symbolischer Verknüpfung sind (Symlinks sind im Allgemeinen immer rwxrwxrwx und chmodwirken sich auf das Ziel des Symlinks auf ihnen aus).

Beachten Sie, dass:

 find backup -type f -exec chmod a-x {} +

würde nur die Erlaubnis von regulären Dateien ändern . Dies würde Verzeichnisse und Symlinks ausschließen , aber auch Geräte , Named Pipes , Sockets und möglicherweise andere, je nach System (obwohl im Falle einer Sicherung eines NTFS-Dateisystems diese wahrscheinlich nicht vorhanden sind).

Stéphane Chazelas
quelle
2

Verwenden Sie in zsh das Glob-Qualifikationsmerkmal . , um nur mit regulären Dateien (ohne symbolische Links) und Dmit Punktdateien übereinzustimmen:

sudo chmod a-x folder\ with\ restored\ backup/**/*(D.)

Wenn die Befehlszeile zu lang ist, können Sie Folgendes verwenden zargs:

zargs -- folder\ with\ restored\ backup/**/*(D.) -- sudo chmod a-x 
Gilles 'SO - hör auf böse zu sein'
quelle