imposta le autorizzazioni di lettura e scrittura per la cartella e tutte le sue directory principali


18

Ho bisogno di impostare le autorizzazioni di lettura e scrittura per l' rootutente alla directory subfolderNe tutte le sue cartelle principali fino a root.

Posso farlo a mano:

$ sudo chmod +rx /root/subfolder1/subfolder2/subfolderN
$ sudo chmod +rx /root/subfolder1/subfolder2
$ sudo chmod +rx /root/subfolder1
$ sudo chmod +rx /root

Ma se Nè grande, sono stanco. Come fare automaticamente con un comando?


Si dovrebbe davvero non rendere /rootleggibile mondo.
Stéphane Chazelas,

Risposte:


23

Questo può essere fatto facilmente nella shell, partendo dal sottodir e spostandosi verso l'alto:

f=/root/subfolder1/subfolder2/subfolderN
while [[ $f != / ]]; do chmod +rx "$f"; f=$(dirname "$f"); done;

Questo inizia con qualunque file / directory tu abbia impostato f, e funziona su ogni directory genitore, fino a quando non incontra "/" (o qualunque cosa tu abbia impostato la stringa nella condizione del ciclo). Non funziona "/".


Bene, sapevo che stavo complicando inutilmente le cose con Perl.
Terdon

Ma cosa succede se fè un percorso relativo, e voglio fermarmi a ciò a cui è relativo anziché /?
StackExchange per tutto il

@ StéphaneChazelas Grazie. Se lo $fè foo/bar, cambierà $fmai in .? Sì lo dirnamefa. Grazie
StackExchange per tutti il

1
@Tim converte il percorso relativo in percorso assoluto prima di memorizzarlo in f usando il comando "f =` readlink -f <relative_path> `"
Talespin_Kit

6

Con csh, tcsh, ksh, zsh, bash, fisho yash -o braceexpand:

sudo chmod +rx /root{,/subfolder1{,/subfolder2{,/subfolderN}}}

Con zsh:

f=/root/subfolder1/subfolder2/subfolderN
until [[ $f = / ]] {chmod +rx $f; f=$f:h;}

Oppure potresti definire una funzione qualificatore glob come:

explode() {
  reply=()
  until [[ $REPLY = [./] ]] {
    reply+=$REPLY
    REPLY=$REPLY:h
  }
}

Da utilizzare ad esempio come:

$ echo chmod +rx subfolder1/subfolder2/subfolderN(+explode)
chmod +rx subfolder1 subfolder1/subfolder2 subfolder1/subfolder2/subfolderN  

Nota che chmod +rx è influenzato dalla umask. Se il tuo umasknon include 007, renderebbe la /rootdirectory leggibile dal mondo e accessibile che è una cattiva idea. /rootè in genere per le cose private del superutente, è una cattiva idea esporlo.


Ci può spiegare quello che il leader ,in {,/subfolder}fa?
terdon

Crea un'alternanza in cui la prima stringa è vuota e la seconda è /subfolder; così /root{,/subfolder}produce /roote/root/subfolder
triplica

In particolare, questo non è portatile per POSIXsh
tripleee

2

Bene, potresti fare qualcosa di leggermente più complesso come:

echo "/root/subfolder1/subfolder2/subfolderN" | 
 perl -anF'/' -e 'while($#F>0){@b=join("/",@F);`chmod +rx @b`; pop @F}' 

Per vedere cosa farà, sostituisci la chmodchiamata con print:

$ echo "/root/subfolder1/subfolder2/subfolderN" | 
 perl -alnF'/' -e 'while($#F>0){@b=join("/",@F);print "chmod +rx @b"; pop @F}' 
chmod +rx /root/subfolder1/subfolder2/subfolderN
chmod +rx /root/subfolder1/subfolder2
chmod +rx /root/subfolder1
chmod +rx /root

1

Non so cosa stai cercando di fare, ma è meglio di non prendere il ricorsivo alla leggera . Detto questo, leggi la risposta effettiva:

Umm ... perché non usare solo ricorsivo.

sudo chmod -R +rx /root

O se non ti piace, puoi dare chmoddiverse directory:

sudo chamod +rx /root /root/subfolder1 /root/subfolder1/subfolder2 /root/subfolder1/subfolder2/subfolderN

4
Non è quasi la stessa operazione, però. chmod -R /rootcambia tutto sotto /root- compresi i file regolari e tutte le directory. La domanda riguarda il cambio di una sola catena di directory.
200_successo

@ 200_success ma non è l'unica risposta;)
Braiam

La domanda non riguarda la ricorsione, ma come impostare le autorizzazioni su una catena di cartelle principali per consentire l'accesso selettivo a una sottocartella. Dire che non è l'unica risposta è come dire che guidare un autobus attraverso il muro è un altro modo per fare una porta.
jmc,
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.