Ich habe versehentlich chmod -R + x in einem Verzeichnis. Wie stelle ich die richtigen Berechtigungen wieder her?

20

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 filealles 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?

Larry Wang
quelle
Hast du das bei /oder einem anderen Verzeichnis gemacht?
gvkv
1
@gvkv: Nein /, ein Verzeichnis, das sich vollständig in meinem Besitz befindet.
Larry Wang
1
@ Larry In Zukunft sollten Sie wahrscheinlich eine Variante von + x verwenden, anstatt alle Berechtigungen zu vergewaltigen und möglicherweise Schreibzugriffe auf alle Dateien zu verursachen.
Xenoterracide
@xenoterracide: Einverstanden. Was ich wirklich wollte, war, der Gruppe die gleichen Berechtigungen zu erteilen (was letztendlich geschah!), Ich habe einfach nicht genug nachgedacht, bevor ich getippt habe.
Larry Wang
Von wie vielen Dateien sprechen wir? Wie viele sollten ausführbar sein? Kann man das an den Dateinamen erkennen?
David Thornley

Antworten:

15

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 , \x7fELFwo \x7fist das Byte mit dem Wert 12, und einige seltenere Dateitypen (a.out, alles registriert binfmt_misc). Daher sollte der folgende Befehl Ihre Berechtigungen in einen vernünftigen Zustand zurückversetzen (setzt bash 4 oder zsh voraus, andernfalls wird er findzum Durchlaufen des Verzeichnisbaums verwendet; Warnung, direkt in den Browser eingegeben):

for x in **/*; do
  if ! [ -f "$x" ]; then continue; fi # skip all but regular files
  case $(head -c 4 "$x") in
    "#!"??) :;; # skip script
    "\x7fELF") :;; # skip ELF executable
    *) chmod a-x "$x";;
  esac
done

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:

getfacl -R >saved-permissions
setfacl --restore=saved-permissions
Gilles 'SO - hör auf böse zu sein'
quelle
Vielen Dank! Zum Glück fällt alles in diese beiden Kategorien. Wenn das irgendetwas vermisst, kann ich mich später darum kümmern.
Larry Wang
Denken Sie daran, dass dies **/*erforderlich ist globstar.
Chris Down
Ich würde zwei Änderungen an diesem Skript empfehlen. findErstens , benutze lieber Globstar als Globstar; Zweitens: Anstatt auf den Kopf zu schauen, verwenden Sie den fileBefehl, um zu sehen, was er ist, und verzweigen Sie von dort.
Shadur
@Shadur findist weniger zuverlässig als globstar, globstarist in fast jedem Fall vorzuziehen.
Chris Down
1
@Gilles Bevorzugt wie in "Wenn Sie es haben, ist es weit überlegen", es ist nicht nur schneller, es ist auch zuverlässiger (und hat keine unerwarteten SNAFUs).
Chris Down
6

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)

find . -type f | xargs grep -L #! | xargs chmod ugo-x

möglicherweise eine bessere Version des oben genannten (weniger Rohre)

find . -type f -exec grep -L #! '{}' + | xargs chmod ugo-x 
Xenoterracid
quelle
3
Stellen Sie das 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 . Bei xargsDateinamen, die Leerzeichen oder Anführungszeichen enthalten, schlägt die Verwendung fehl. use xargs -d '\n'(benötigt GNU xargs).
Gilles 'SO - hör auf böse zu sein'
0

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 einiger grepund chmodkombinierter 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.

gvkv
quelle
Ich mache mir weniger Sorgen um falsche Positive als um falsche Negative. Es gibt Binaries, von denen ich glaube, dass sie nicht anfangen #!.
Larry Wang