Par inadvertance, j'ai supprimé ma structure d'autorisation de disque - pourquoi?

23

J'essayais de l' chownintérieur /optet pour une raison quelconque j'ai chownsauté vers le parent et tout réprimé.

Quelqu'un peut-il suggérer pourquoi / comment cela pourrait se produire et comment éviter de le faire à l'avenir? C'est un peu inquiétant que l'exécution d'une commande dans un répertoire donné puisse effectivement sauter et l'exécuter dans le répertoire racine.

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 >
Duke Dougal
la source
2
Je l'aurais fait comme ceci: sudo chown -R root:wwwdata /optselon la boîte de dialogue --help ... peut-être que l'utilisation de ce canal a causé un problème ???
Joshua Besneatte
13
.*correspond ..(le répertoire parent, qui est /) - voir Est
steeldriver
7
@steeldriver qui sonne comme tel devrait être publié comme réponse;)
Joshua Besneatte
2
Alors, quelle est la bonne façon de définir des autorisations sur des fichiers cachés, ce que j'essayais de faire?
Duke Dougal
4
@JoshuaBesneatte J'essaie d'éviter d'exécuter des commandes récursives sur des arguments commençant par / car la plupart des claviers mettent / assez près de la touche Entrée, et il est trop facile d'appuyer accidentellement sur Entrée avant de taper le reste de la commande. Pour atténuer ce risque, on peut soit cdaccéder au répertoire racine et omettre le leaing /, soit démarrer la commande avec (, ce qui signifie que la commande ne sera pas exécutée tant que la correspondance n'aura pas été )tapée, donnant la possibilité d'appuyer sur Ctrl-C et de renflouer d'une mauvaise erreur (comme rm -rf /tmp/foo-installet en appuyant sur Entrée au lieu de T).
Monty Harder

Réponses:

25

Cela est arrivé parce que vous avez utilisé:

sudo chown -R root:www-data .*

quand vous auriez dû utiliser ceci à la place:

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

Tout d'abord, -Rest récursif pour tous les répertoires sous le répertoire cible.

En outre, *correspondra à tous les fichiers et répertoires du répertoire actuel. Ensuite, .*correspondra à tous les fichiers et répertoires un niveau au - dessus du répertoire actuel.

Pour éviter cela à l'avenir, vous pouvez utiliser la lscommande pour vérifier le chemin avant d'exécuter la chowncommande comme dans ces exemples:

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

Une autre façon d'éviter cela est de toujours utiliser le chemin d'accès complet au répertoire dans lequel vous souhaitez exécuter une commande.

Voici un exemple:

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

Modifier:

Vous pouvez utiliser la commande suivante pour chmodtous les fichiers ou répertoires cachés directement sous /opt(en supposant que le premier caractère après le .qui les rend cachés soit une lettre, un chiffre, un tiret ou un trait de soulignement qui devrait être vrai pour la plupart des fichiers).

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

Vous pouvez vérifier de quels fichiers il s'agit chmoden exécutant la commande suivante:

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

La première partie de la commande : for i in /opt/.[A-Za-z0-9-_]*dit que, pour tous les résultats du glob /opt/.[A-Za-z0-9-_]* affectez chaque résultat à la variable "i".

Le glob ici dit que le premier caractère doit être .et que le caractère suivant [A-Za-z0-9-_] doit être n'importe quel caractère qui est AZ ou az ou n'importe quel nombre 0-9 ou a -ou a _.

Cela exclura les résultats .et ..qui représentent le répertoire en cours et le répertoire au-dessus du répertoire en cours et n'inclura que les fichiers et répertoires cachés.

La deuxième partie de la commande : do sudo chmod root:www-data "/opt/$i"indique d'exécuter la commande pour toutes les variables qui correspondent à la valeur actuelle de $i.

La troisième partie de la commande : donedit que j'ai fini.


De plus, vous avez utilisé l' -Roption avec chmodet l' -Roption est récursive et s'appliquera à tous les répertoires et fichiers.

Lorsque vous n'utilisez que la chmodcommande sans options, la commande ne s'applique qu'au fichier ou répertoire spécifique que vous lui avez donné et ne s'applique pas récursivement aux répertoires.

mchid
la source
5
Mon intention était de cibler les fichiers cachés. J'ai supposé à tort que la syntaxe utilisée pour accueillir les fichiers cachés comme décrit ici stackoverflow.com/questions/10375689/… est généralement une syntaxe valide pour les fichiers cachés. Ne semble pas.
Duke Dougal
2
@DukeDougal Vous ne devriez pas accepter la première réponse qui apparaît tout de suite. Il est généralement préférable d'attendre, disons, 24 heures avant d'accepter. Pendant ce temps, d'autres réponses plus utiles ou mieux écrites pourraient apparaître et mériteraient d'être acceptées. Vous pouvez voter pour toutes les réponses que vous jugez utiles. StackExchange ne concerne pas (ou ne devrait pas être) "qui répond en premier" mais "qui fournit la meilleure réponse" (à la fois en termes de contenu et de clarté).
Giacomo Alzetta
11
Le montage est terrible. Il suggère d'analyser la lssortie et est très lent tandis que la réponse est à utiliser find.
val dit Réintégrer Monica le
9
(1) Aucun caractère générique (glob / pattern) n'est récursif en bash à l'exception de **, et même cela doit être explicitement activé. À mon humble avis, vous devriez être plus clair sur le rôle de  -R. (2) Il est conseillé aux utilisateurs d'éviter d'utiliser plain *car il peut correspondre aux noms de fichiers commençant par -, qui seront alors interprétés comme des options.  devrait protéger contre cela, mais je ne suis pas sûr que toutes les commandes respectent cette convention. … (Suite)command -- *
Scott
6
(Suite)… (3)  *,  ./* et ne /opt/* parviennent même  pas à trouver des «fichiers de points» ( .*) à moins que l' dotgloboption ne soit définie. Comme le  disent Joshua Besneatte et  ilkkachu , chown -R /optet ils chown -R .sont meilleurs. … (Suite)
Scott
45

Le shell glob .*correspond ..(le répertoire parent) dans ce cas, malheureusement, c'est /:

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

Pour une discussion supplémentaire, voir:

tournevis
la source
6
Ceci est la réponse correcte et beaucoup plus simple
abligh
5

Vos problèmes sont venus parce que .*correspond à tout ce qui commence par un point. Le contexte est le répertoire courant, car cette expression n'inclut pas de chemin. Donc, s'il y a des fichiers ou des dossiers cachés comme .gitdans le répertoire actuel, vous les rapprocherez. Mais (comme vous le verrez en exécutant ls -adans ce dossier), vous allez également faire correspondre .et..

Et .., bien sûr, est le répertoire parent, donc chmod -Rciblé récursivement tout dans le répertoire parent.

alexis
la source
Un chemin absolu comme /opt/.*n'aiderait pas, /opt/..est le même ..qu'avec CWD = /opt.
Peter Cordes
@Peter: Oui, c'est exact: si l'expression incluait un chemin, cela donnerait le contexte (le point de départ), au lieu que ce soit le répertoire courant. L'OP devait être utilisé .comme contexte, mais cela n'a pas fonctionné de cette façon en raison de la barre oblique manquante ...
Alexis