Inadvertidamente destruyó la estructura de permisos de mi disco, ¿por qué?

23

Estaba tratando de hacerlo por chowndentro /opty, por alguna razón, chownsalté a los padres y me di todo.

¿Alguien puede sugerir por qué / cómo podría suceder esto y cómo evitar hacerlo en el futuro? Es un poco preocupante que ejecutar un comando en un directorio dado pueda saltar y ejecutarlo en el directorio raíz.

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 >
Duque dugal
fuente
2
Lo hubiera hecho así: sudo chown -R root:wwwdata /optsegún el diálogo --help ... ¿quizás el uso de esa tubería causó algún problema?
Joshua Besneatte
13
.*coincide ..(el directorio padre, que es /) - consulte ¿Los directorios padres chmod “.. chmod 777. * -R” (..)?
steeldriver
77
@steeldriver que parece que debería publicarse como respuesta;)
Joshua Besneatte
2
Entonces, ¿cuál es la forma correcta de establecer permisos en archivos ocultos, que es lo que estaba tratando de hacer?
Duque Dougal
44
@JoshuaBesneatte Intento evitar ejecutar comandos recursivos en argumentos que comienzan con / porque la mayoría de los teclados se ubican / bastante cerca de la tecla Enter, y es demasiado fácil presionar Enter accidentalmente antes de escribir el resto del comando. Para mitigar este riesgo, uno puede cdir al directorio raíz y omitir leaing /, o iniciar el comando con (, lo que significa que el comando no se ejecutará hasta que )se escriba la coincidencia , dando la oportunidad de presionar Ctrl-C y rescatar de un error grave (como rm -rf /tmp/foo-installpresionar Enter en lugar de T).
Monty Harder

Respuestas:

25

Esto sucedió porque usaste:

sudo chown -R root:www-data .*

cuando deberías haber usado esto en su lugar:

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

Primero, -Res recursivo para todos los directorios bajo el directorio de destino.

Además, *coincidirá con todos los archivos y directorios del directorio actual. A continuación, .*coincidirá con todos los archivos y directorios un nivel por encima del directorio actual.

Para evitar esto en el futuro, puede usar el lscomando para verificar la ruta antes de ejecutar el chowncomando como en estos ejemplos:

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

Otra forma de evitar esto es utilizar siempre la ruta completa al directorio en el que desea ejecutar un comando.

Aquí hay un ejemplo:

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

Editar:

Puede usar el siguiente comando para chmodtodos los archivos o directorios ocultos directamente debajo /opt(suponiendo que el primer carácter después del .que los oculta es una letra, un número, un guión o un guión bajo que debería ser verdadero para la mayoría de los archivos).

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

Puede verificar qué archivos esto chmodejecutará ejecutando el siguiente comando:

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

La primera parte del comando : for i in /opt/.[A-Za-z0-9-_]*dice que, para todos los resultados del globo, /opt/.[A-Za-z0-9-_]* asigne cada resultado a la variable "i".

El glob aquí dice que el primer carácter debe ser .y que el siguiente carácter [A-Za-z0-9-_] debe ser cualquier carácter que sea AZ o az o cualquier número 0-9 o a -o a _.

Esto excluirá los resultados .y ..que representan el directorio actual y el directorio sobre el directorio actual y solo incluirá archivos y directorios ocultos.

La segunda parte del comando : do sudo chmod root:www-data "/opt/$i"dice ejecutar el comando para todas las variables que coinciden con el valor actual de $i.

La tercera parte del comando : donedice que he terminado.


Además, usó la -Ropción con chmody la -Ropción es recursiva y se aplicará a todos los directorios y archivos.

Cuando solo usa el chmodcomando sin opciones, el comando solo se aplicará al archivo o directorio específico que le proporcionó y no se aplicará recursivamente a los directorios.

mchid
fuente
55
Mi intención era apuntar a archivos ocultos. Asumí erróneamente que la sintaxis utilizada para agrupar archivos ocultos como se describe aquí stackoverflow.com/questions/10375689/… es generalmente una sintaxis válida para archivos ocultos. Parece que no.
Duque Dougal
2
@DukeDougal No debe aceptar la primera respuesta que aparece de inmediato. En general, es mejor esperar, digamos, 24 horas antes de aceptar. En ese momento pueden surgir otras respuestas más útiles o mejor escritas que merecerían ser aceptadas. Puede votar todas las respuestas que considere útiles. StackExchange no es (o no debería ser) sobre "quién responde primero" sino "quién proporciona la mejor respuesta" (tanto en términos de contenido como de claridad).
Giacomo Alzetta
11
Editar es terrible. Sugiere analizar la lssalida y es muy lenta mientras se usa la respuesta find.
Val dice reinstalar Mónica el
99
(1) Ningún comodín (glob / patrón) es recursivo en bash excepto **, e incluso eso tiene que habilitarse explícitamente. En mi humilde opinión, debe ser más claro sobre el papel de  -R. (2) Se recomienda a las personas que eviten el uso de plain *porque puede coincidir con nombres de archivos que comienzan con -, que luego se interpretarán como opciones.  debería proteger contra eso, pero no estoy seguro de que todos los comandos honren esa convención. ... (Continúa)command -- *
Scott
66
(Cont.) ... (3)  *,  ./* e incluso  /opt/* no pueden encontrar "archivos de puntos" ( .*) a menos que la dotglobopción esté configurada. Como  dicen Joshua Besneatte e  ilkkachu , chown -R /opty chown -R .están mejor. ... (Continúa)
Scott
45

El shell glob .*coincide ..(el directorio padre) en este caso, lamentablemente, eso es /:

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

Para una discusión adicional ver:

conductor de acero
fuente
66
Esta es la respuesta correcta y mucho más simple
hasta el
5

Sus problemas llegaron porque .*coincide con todo lo que comienza con un punto. El contexto es el directorio actual, ya que esta expresión no incluye una ruta. Entonces, si hay archivos o carpetas ocultos como .giten el directorio actual, los emparejará. Pero (como verá al ejecutar ls -aen esa carpeta), también coincidirá .y..

Y .., por supuesto, es el directorio principal, por lo que se chmod -Rdirigió recursivamente a todo el directorio principal.

alexis
fuente
Una ruta absoluta como /opt/.*no ayudaría, /opt/..es la misma que ..con CWD = /opt.
Peter Cordes
@ Peter: Sí, eso es correcto: si la expresión incluye una ruta, eso daría el contexto (el punto de partida), en lugar de ser el directorio actual. El OP .tenía la intención de usarse como contexto, pero no funcionó de esa manera debido a la barra oblicua perdida ...
alexis