Ho rovinato inavvertitamente la mia struttura di autorizzazione del disco - perché?


23

Stavo cercando di chowndentro /opte per qualche motivo chownha saltato fino al genitore e chowned tutto.

Qualcuno può suggerire perché / come ciò potrebbe accadere e come evitare di farlo in futuro? È un po 'preoccupante che l'esecuzione di un comando in una determinata directory possa effettivamente saltare ed eseguirlo nella directory principale.

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 >

2
L'avrei fatto così: sudo chown -R root:wwwdata /optcome nella finestra di dialogo --help ... forse l'uso di quella pipe ha causato qualche problema ???
Joshua Besneatte,

13
.*abbinamenti ..(la directory principale, che è /) - vedi Fa "chmod 777. * -R" chmod directory madri (..)?
steeldriver

7
@steeldriver sembra che dovrebbe essere pubblicato come una risposta;)
Joshua Besneatte

2
Quindi qual è il modo corretto di impostare le autorizzazioni per i file nascosti, che cosa stavo cercando di fare?
Duke Dougal,

4
@JoshuaBesneatte Cerco di evitare di eseguire comandi ricorsivi su argomenti che iniziano con / perché la maggior parte delle tastiere si avvicina / è abbastanza vicina al tasto Invio, ed è troppo facile premere accidentalmente Invio prima di digitare il resto del comando. Per mitigare questo rischio, si può o cdnella directory principale e omettere il leaing /, o avviare il comando con (, il che significa che il comando non verrà eseguito fino a quando non )viene digitata la corrispondenza , dando l'opportunità di premere Ctrl-C e salvare di un brutto errore (come rm -rf /tmp/foo-installe premere Invio invece di T).
Monty Harder,

Risposte:


25

Questo è successo perché hai usato:

sudo chown -R root:www-data .*

quando invece avresti dovuto usare questo:

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

Innanzitutto, -Rè ricorsivo per tutte le directory nella directory di destinazione.

Inoltre, *corrisponderà a tutti i file e le directory nella directory corrente. Successivamente, .*corrisponderà a tutti i file e directory un livello sopra la directory corrente.

Per evitarlo in futuro, è possibile utilizzare il lscomando per verificare il percorso prima di eseguire il chowncomando come in questi esempi:

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

Un altro modo per evitarlo è utilizzare sempre il percorso completo della directory in cui si desidera eseguire un comando.

Ecco un esempio:

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

Modificare:

Puoi usare il seguente comando per chmodtutti i file o le directory nascosti direttamente sotto /opt(supponendo che il primo carattere dopo .che li rende nascosti sia una lettera, un numero, un trattino o un trattino basso che dovrebbe essere vero per la maggior parte dei file).

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

Puoi verificare quali file saranno chmodeseguendo il comando seguente:

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

La prima parte del comando : for i in /opt/.[A-Za-z0-9-_]*dice che, per tutti i risultati del glob /opt/.[A-Za-z0-9-_]* assegnare ogni risultato alla variabile "i".

Il glob qui dice che il primo carattere deve essere .e che il personaggio successivo [A-Za-z0-9-_] deve essere qualsiasi carattere che sia AZ o az o qualsiasi numero 0-9 o a -o a _.

Ciò escluderà i risultati .e ..che rappresentano la directory corrente e la directory sopra la directory corrente e includeranno solo file e directory nascosti.

La seconda parte del comando : do sudo chmod root:www-data "/opt/$i"dice di eseguire il comando per tutte le variabili che corrispondono al valore corrente di $i.

La terza parte del comando : donedice che ho finito.


Inoltre, hai usato l' -Ropzione con chmode l' -Ropzione è ricorsiva e si applicherà a tutte le directory e file.

Quando si utilizza solo il chmodcomando senza opzioni, il comando si applicherà solo al file o alla directory specifici che gli è stato fornito e non si applicherà in modo ricorsivo alle directory.


5
Il mio intento era mirare ai file nascosti. Ho erroneamente supposto che la sintassi utilizzata per il grepping dei file nascosti, come descritto qui stackoverflow.com/questions/10375689/…, è generalmente una sintassi valida per i file nascosti. Sembra di no.
Duke Dougal,

2
@DukeDougal Non dovresti accettare la prima risposta che arriva subito. In genere è meglio aspettare, diciamo, 24 ore prima di accettare. In quel momento potrebbero emergere altre risposte scritte più utili o migliori che meriterebbero di essere accettate. Puoi votare tutte le risposte che ritieni utili. StackExchange non riguarda (o non dovrebbe essere) "chi risponde per primo" ma "chi fornisce la risposta migliore" (sia in termini di contenuto che di chiarezza).
Giacomo Alzetta,

11
La modifica è terribile. Suggerisce di analizzare l' lsoutput ed è molto lento mentre si usa la risposta find.
dice Val Ripristina Monica il

9
(1) Nessun carattere jolly (glob / pattern) è ricorsivo in bash ad eccezione di **, e anche quello deve essere esplicitamente abilitato. IMHO, dovresti essere più chiaro sul ruolo di  -R. (2) Si consiglia alle persone di evitare l'uso di plain *perché può corrispondere a nomi di file che iniziano con -, che verranno quindi interpretati come opzioni.  dovrebbe proteggerlo, ma non sono sicuro che tutti i comandi rispettino tale convenzione. ... (proseguendo)command -- *
Scott,

6
(Continua) ... (3)  *,  ./* e persino  /opt/* non riescono a trovare "file dot" ( .*) a meno che l' dotglobopzione non sia impostata. Come  dicono Joshua Besneatte e  ilkkachu , chown -R /opte chown -R .stanno meglio. ... (proseguendo)
Scott,

45

La shell glob .*corrisponde ..(la directory principale) in questo caso purtroppo è /:

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

Per ulteriori discussioni vedere:


6
Questa è la risposta corretta e molto più semplice
circa il

5

I tuoi problemi sono arrivati ​​perché .*corrisponde a tutto ciò che inizia con un punto. Il contesto è la directory corrente, poiché questa espressione non include un percorso. Quindi, se ci sono file o cartelle nascosti come .gitnella directory corrente, li abbinerai. Ma (come vedrai eseguendo ls -aquella cartella), abbinerai anche .e..

E .., naturalmente, è la directory principale, quindi chmod -Rindirizzato in modo ricorsivo tutto nella directory principale.


Un percorso assoluto come /opt/.*non sarebbe d'aiuto, /opt/..è lo stesso ..di CWD = /opt.
Peter Cordes,

@Peter: Sì, è corretto: se l'espressione includesse un percorso, ciò darebbe il contesto (il punto di partenza), anziché essere la directory corrente. L'OP intendeva utilizzare .come contesto, ma non ha funzionato in questo modo a causa della barra mancante ...
alexis
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.