Inadvertidamente destruiu minha estrutura de permissão de disco - por quê?

23

Eu estava tentando chowndentro /opte por algum motivo chownsaltou para o pai e chowned tudo.

Alguém pode sugerir por que / como isso pode acontecer e como evitar fazê-lo no futuro? É um pouco preocupante que a execução de um comando em um determinado diretório possa efetivamente saltar para cima e executá-lo no diretório raiz.

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
fonte
2
Eu teria feito assim: sudo chown -R root:wwwdata /optconforme a caixa de diálogo --help ... talvez o uso desse pipe tenha causado algum problema ???
Joshua Besneatte 24/07
13
.*corresponde ..(o diretório pai, que é /) - consulte Os diretórios pai chmod “chmod 777. * -R” (..)?
steeldriver 24/07
7
@steeldriver que parece que deve ser publicado como resposta;)
Joshua Besneatte 24/07
2
Então, qual é a maneira correta de definir permissões em arquivos ocultos, o que eu estava tentando fazer?
Duke Dougal
4
@JoshuaBesneatte Tento evitar executar comandos recursivos em argumentos que começam com / porque a maioria dos teclados coloca / bastante perto da tecla Enter e é muito fácil pressionar acidentalmente Enter antes de digitar o restante do comando. Para mitigar esse risco, pode-se cdacessar o diretório raiz e omitir o leaing / ou iniciar o comando com (, o que significa que o comando não será executado até que a correspondência )seja digitada, dando a oportunidade de pressionar Ctrl-C e salvar de um erro grave (como rm -rf /tmp/foo-installpressionar Enter em vez de T).
Monty Harder

Respostas:

25

Isso aconteceu porque você usou:

sudo chown -R root:www-data .*

quando você deveria ter usado isso:

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

Primeiro, -Ré recursivo para todos os diretórios no diretório de destino.

Além disso, *corresponderá a todos os arquivos e diretórios no diretório atual. Em seguida, .*corresponderá a todos os arquivos e diretórios um nível acima do diretório atual.

Para evitar isso no futuro, você pode usar o lscomando para verificar o caminho antes de executar o chowncomando, como nestes exemplos:

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

Outra maneira de evitar isso é sempre usar o caminho completo para o diretório para o qual você deseja executar um comando.

Aqui está um exemplo:

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

Editar:

Você pode usar o seguinte comando para chmodtodos os arquivos ou diretórios ocultos diretamente sob /opt(assumindo que o primeiro caractere após o .que os oculta seja uma letra, um número, um traço ou um sublinhado que deve ser verdadeiro para a maioria dos arquivos).

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

Você pode verificar quais arquivos serão chmodexecutados executando o seguinte comando:

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

A primeira parte do comando : for i in /opt/.[A-Za-z0-9-_]*diz que, para todos os resultados da glob, /opt/.[A-Za-z0-9-_]* atribua cada resultado à variável "i".

O glob aqui diz que o primeiro caractere deve ser .e que o próximo caractere [A-Za-z0-9-_] deve ser qualquer caractere que seja AZ ou az ou qualquer número 0-9 ou a -ou a _.

Isso excluirá os resultados .e ..que representam o diretório atual e o diretório acima do diretório atual e incluirá apenas arquivos e diretórios ocultos.

A segunda parte do comando : do sudo chmod root:www-data "/opt/$i"diz para executar o comando para todas as variáveis ​​que correspondem ao valor atual de $i.

A terceira parte do comando : donediz que eu terminei.


Além disso, você usou a -Ropção com chmode a -Ropção é recursiva e será aplicada a todos os diretórios e arquivos.

Quando você usa apenas o chmodcomando apenas sem opções, o comando será aplicado apenas ao arquivo ou diretório específico que você forneceu e não será aplicado recursivamente aos diretórios.

mchid
fonte
5
Minha intenção era direcionar arquivos ocultos. Eu assumi erroneamente que a sintaxe usada para grepping arquivos ocultos, conforme descrito aqui stackoverflow.com/questions/10375689/… geralmente é uma sintaxe válida para arquivos ocultos. Parecem não.
Duke Dougal
2
@DukeDougal Você não deve aceitar a primeira resposta que surgir imediatamente. Geralmente, é melhor esperar, digamos, 24 horas antes de aceitar. Nesse período, podem surgir outras respostas escritas mais úteis ou melhores que merecem ser aceitas. Você pode votar todas as respostas que julgar úteis. O StackExchange não é (ou não deveria ser) sobre "quem responde primeiro", mas "quem fornece a melhor resposta" (tanto em termos de conteúdo quanto de clareza).
Giacomo Alzetta 25/07
11
Editar é terrível. Ele sugere analisar a lssaída e é muito lento enquanto a resposta é usada find.
val diz Restabelecer Monica
9
(1) Nenhum curinga (glob / padrão) é recursivo no bash, exceto **, e mesmo isso deve ser explicitamente ativado. IMHO, você deve ser mais claro sobre o papel de  -R. (2) As pessoas são aconselhadas a evitar o uso simples, *pois podem corresponder a nomes de arquivos iniciados por -, que serão interpretados como opções.  deve proteger contra isso, mas não tenho certeza de que todos os comandos honrem essa convenção. ... (continua)command -- *
Scott
6
(Continua) ... (3)  *,  ./* e até mesmo  /opt/* deixar de encontrar “dot files” ( .*) a menos que o dotglobopção é definida. Como  Joshua Besneatte e  ilkkachu dizem, chown -R /opte chown -R .são melhores. ... (continua)
Scott
45

O shell glob .*corresponde ..(o diretório pai) neste caso, infelizmente, é o seguinte /:

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 discussões adicionais, consulte:

chave de aço
fonte
6
Esta é a resposta correta e muito mais simples
abligh 25/07
5

Seus problemas vieram porque .*corresponde a tudo que começa com um ponto. O contexto é o diretório atual, pois essa expressão não inclui um caminho. Portanto, se houver arquivos ou pastas ocultos, como .gitno diretório atual, você os corresponderá. Mas (como você verá executando ls -anessa pasta), você também corresponderá .e..

E .., é claro, é o diretório pai, de modo tão chmod -Rrecursivo direcionado para tudo no diretório pai.

alexis
fonte
Um caminho absoluto como /opt/.*não ajudaria, /opt/..é o mesmo que ..com CWD = /opt.
Peter Cordes
@ Peter: Sim, isso está correto: se a expressão incluísse um caminho, isso daria o contexto (o ponto de partida), em vez de ser o diretório atual. O OP pretendia usar .como contexto, mas não funcionou dessa maneira devido à barra que faltava ...
alexis 27/07