Ich habe versehentlich meine Festplatten-Berechtigungsstruktur geändert - warum?

23

Ich versuchte nach chowninnen zu kommen /optund chownsprang aus irgendeinem Grund auf die Eltern zu und verschluckte alles.

Kann jemand vorschlagen, warum / wie dies passieren könnte und wie dies in Zukunft vermieden werden kann? Ein bisschen geht es darum, dass das Ausführen eines Befehls in einem bestimmten Verzeichnis effektiv dazu führen kann, dass er im Stammverzeichnis ausgeführt wird.

ubuntu: /opt > sudo chown -R root:www-data .*
chown: changing ownership of '../var/lib/lxcfs/proc/cpuinfo': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/proc/meminfo': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/proc/stat': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/proc/uptime': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/proc/diskstats': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/proc/swaps': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/proc': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/cgroup/devices': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/cgroup/blkio': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/cgroup/hugetlb': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/cgroup/rdma': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/cgroup/pids': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/cgroup/freezer': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/cgroup/cpuset': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/cgroup/memory': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/cgroup/perf_event': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/cgroup/cpu,cpuacct': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/cgroup/net_cls,net_prio': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/cgroup/name=systemd': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/cgroup/unified': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/cgroup': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs': No such file or directory
^C
:ubuntu: /opt >
Herzog Dougal
quelle
2
Ich hätte es so gemacht: sudo chown -R root:wwwdata /optWie im --help-Dialog ... hat die Verwendung dieser Pipe vielleicht ein Problem verursacht ???
Joshua Besneatte
13
.*Übereinstimmungen ..(das übergeordnete Verzeichnis, das ist /) - siehe "chmod 777. * -R" chmod übergeordnete Verzeichnisse (..)?
Steeldriver
7
@steeldriver das klingt wie es sollte als Antwort gepostet werden;)
Joshua Besneatte
2
Was ist nun die richtige Art, Berechtigungen für versteckte Dateien festzulegen, was habe ich versucht?
Duke Dougal,
4
@JoshuaBesneatte Ich versuche zu vermeiden, dass rekursive Befehle für Argumente ausgeführt werden, die mit / beginnen, da die meisten Tastaturen / ziemlich nahe an der Eingabetaste liegen, und es zu einfach ist, versehentlich die Eingabetaste zu drücken, bevor der Rest des Befehls eingegeben wird. Um dieses Risiko zu cdminimieren , können Sie entweder in das Stammverzeichnis wechseln und das Leaing / auslassen oder den Befehl mit starten. Dies (bedeutet, dass der Befehl erst ausgeführt wird, wenn der Abgleich )eingegeben wurde. Auf diese Weise können Sie Strg-C drücken und aussteigen von einem schweren Fehler (wie rm -rf /tmp/foo-installund drücken Sie Enter anstelle von T).
Monty Harder

Antworten:

25

Dies geschah, weil Sie Folgendes verwendet haben:

sudo chown -R root:www-data .*

wenn Sie dies stattdessen hätten verwenden sollen:

sudo chown -R root:www-data ./*

Erstens -Rist es für alle Verzeichnisse unter dem Zielverzeichnis rekursiv.

Außerdem *werden alle Dateien und Verzeichnisse unter dem aktuellen Verzeichnis abgeglichen. Als nächstes .*werden alle Dateien und Verzeichnisse eine Ebene über dem aktuellen Verzeichnis abgeglichen.

Um dies in Zukunft zu vermeiden, können Sie lsden Pfad mit dem Befehl überprüfen, bevor Sie den chownBefehl wie in den folgenden Beispielen ausführen :

ls -a ./*
ls -a *
ls -a .*
ls -a ../*

Eine andere Möglichkeit, dies zu vermeiden, besteht darin, immer den vollständigen Pfad zu dem Verzeichnis zu verwenden, in das Sie einen Befehl ausführen möchten.

Hier ist ein Beispiel:

sudo chown -R root:www-data /opt/*

Bearbeiten:

Sie können den folgenden Befehl für chmodalle versteckten Dateien oder Verzeichnisse direkt darunter verwenden /opt(vorausgesetzt, das erste Zeichen nach dem ., das sie versteckt, ist ein Buchstabe, eine Zahl, ein Bindestrich oder ein Unterstrich, der für die meisten Dateien zutreffen sollte).

for i in /opt/.[A-Za-z0-9-_]*; do sudo chmod root:www-data "/opt/$i"; done

Sie können überprüfen, welche Dateien dies bewirkt, chmodindem Sie den folgenden Befehl ausführen:

ls /opt/.[A-Za-z0-9-_]*

Der erste Teil des Befehls : for i in /opt/.[A-Za-z0-9-_]*sagt , dass für alle die Ergebnisse der glob /opt/.[A-Za-z0-9-_]* assign jedes Ergebnis der Variablen „i“.

Der Glob hier sagt, dass das erste Zeichen sein muss .und dass das nächste Zeichen [A-Za-z0-9-_] ein beliebiges Zeichen sein muss, das AZ oder az oder eine beliebige Zahl von 0 bis 9 oder a -oder a ist _.

Dadurch werden die Ergebnisse ausschließen .und ..die das aktuelle Verzeichnis und das Verzeichnis über dem aktuellen Verzeichnis dar und enthält nur versteckte Dateien und Verzeichnisse.

Der zweite Teil des Befehls : do sudo chmod root:www-data "/opt/$i"Sagt, dass der Befehl für alle Variablen ausgeführt werden soll, die mit dem aktuellen Wert von übereinstimmen $i.

Der dritte Teil des Befehls : donesagt, dass ich fertig bin.


Darüber hinaus haben Sie die -ROption mit chmodund die -ROption ist rekursiv und gilt für alle Verzeichnisse und Dateien.

Wenn Sie nur den chmodBefehl ohne Optionen verwenden, gilt der Befehl nur für die angegebene Datei oder das angegebene Verzeichnis und nicht rekursiv für Verzeichnisse.

mchid
quelle
5
Ich wollte versteckte Dateien als Ziel haben. Ich nehme fälschlicherweise , dass die Syntax für greppen versteckte Dateien verwendet , wie hier beschrieben stackoverflow.com/questions/10375689/... ist allgemein gültige Syntax für versteckte Dateien. Sieht nicht so aus.
Duke Dougal
2
@DukeDougal Sie sollten die erste Antwort, die sofort eingeht, nicht akzeptieren. Es ist im Allgemeinen besser, beispielsweise 24 Stunden vor der Annahme zu warten. In dieser Zeit könnten andere nützlichere oder besser geschriebene Antworten auftauchen, die es verdienen würden, angenommen zu werden. Sie können alle Antworten, die Sie für nützlich halten, positiv bewerten. Bei StackExchange geht es nicht darum, wer zuerst antwortet, sondern darum, wer die beste Antwort liefert (sowohl inhaltlich als auch inhaltlich).
Giacomo Alzetta
11
Bearbeiten ist schrecklich. Es schlägt vor, die lsAusgabe zu analysieren, und ist sehr langsam, während die Antwort verwendet werden soll find.
Val sagt Reinstate Monica
9
(1) Kein Platzhalter (glob / pattern) ist in der Bash rekursiv außer **, und selbst das muss explizit aktiviert werden. IMHO, Sie sollten klarer über die Rolle von sein  -R. (2) Personen wird empfohlen, die Verwendung von Plain zu vermeiden, *da diese mit den Dateinamen übereinstimmen kann -, die mit beginnen. Diese werden dann als Optionen interpretiert.  sollte dagegen schützen, aber ich bin nicht sicher, ob alle Befehle diese Konvention einhalten. … (Fortsetzung)command -- *
Scott
6
(Forts.)… (3) *,  ./* und es ist sogar  /opt/* nicht möglich, „ Punktedateien  “ ( .*) zu finden, es sei denn, die dotglobOption ist aktiviert. Wie  Joshua Besneatte und  Ilkkachu sagen chown -R /optund chown -R .besser sind. … (Fortsetzung)
Scott
45

Das Shell-Glob .*entspricht ..in diesem Fall leider (dem übergeordneten Verzeichnis) /:

steeldriver@t400s:/opt$ ls .*
.:

..:
bin  boot  cdrom  dev  etc  home  initrd.img  initrd.img.old  lib  lib32  lib64
libx32  lost+found  media  mnt  opt  proc  root  run  sbin  snap  srv  swapfile  sys
tmp  usr  var  vmlinuz  vmlinuz.old

Weitere Diskussion finden Sie unter:

Stahlfahrer
quelle
6
Dies ist die richtige und viel einfachere Antwort
abligh
5

Ihre Probleme kamen, weil alles , was mit einem Punkt beginnt, .*übereinstimmt . Der Kontext ist das aktuelle Verzeichnis, da dieser Ausdruck keinen Pfad enthält. Wenn sich also versteckte Dateien oder Ordner wie im aktuellen Verzeichnis befinden, stimmen Sie mit diesen überein. Aber (wie Sie sehen werden, wenn Sie in diesem Ordner laufen ), werden Sie auch mit und übereinstimmen.gitls -a...

Und ..natürlich ist es das übergeordnete Verzeichnis, also chmod -Rrekursiv alles im übergeordneten Verzeichnis.

alexis
quelle
Ein absoluter Pfad wie /opt/.*würde nicht helfen, /opt/..ist der gleiche wie ..bei CWD = /opt.
Peter Cordes
@Peter: Ja, das ist richtig: Wenn der Ausdruck einen Pfad enthält, wird der Kontext (der Ausgangspunkt) angegeben, anstatt das aktuelle Verzeichnis zu sein. Das OP sollte .als Kontext verwendet werden, aber es funktionierte aufgrund des fehlenden Schrägstrichs nicht so ...
alexis