definir permissões de leitura e gravação para a pasta e todos os seus diretórios pai

17

Eu preciso definir permissões de leitura e gravação para rooto diretório do usuário subfolderNe todas as suas pastas pai até root.

Eu posso fazer isso pelas mãos:

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

Mas se Nfor grande, estou cansado. Como fazer automaticamente por um comando?

Maxim Yefremov
fonte
Você realmente não deve tornar o /rootmundo legível.
Stéphane Chazelas

Respostas:

22

Isso pode ser feito facilmente no shell, começando no subdir e movendo-se para cima:

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

Isso começa com qualquer arquivo / diretório que você definir f também e funciona em todos os diretórios pai, até encontrar "/" (ou o que quer que você configure a string na condição do loop para). Não chmod "/".

wingedsubmariner
fonte
Legal, eu sabia que estava complicando as coisas desnecessariamente com Perl.
terdon
Mas e se ffor um caminho relativo, e eu quero parar com o que é relativo em vez de /?
Tim
@ StéphaneChazelas Obrigado. Se $ffor foo/bar, $falguma vez mudará para .? Sim dirnamefaz isso. Obrigado
Tim
1
@ Tim converter caminho relativo para caminho absoluto antes de armazenar em f usando o comando "f =` readlink -f <caminho_relativo> `"
Talespin_Kit 15/04
6

Com csh, tcsh, ksh, zsh, bash, fishou yash -o braceexpand:

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

Com zsh:

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

Ou você pode definir uma função qualificadora global como:

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

Para ser usado, por exemplo, como:

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

Observe que chmod +rxé afetado pelo umask. Se o seu umasknão incluir 007, tornará o /rootdiretório legível e acessível ao mundo, o que é uma má ideia. /rooté tipicamente para coisas particulares do superusuário, é uma má ideia expô-lo.

Stéphane Chazelas
fonte
Poderia explicar o que o líder ,em {,/subfolder}faz?
terdon
Ele cria uma alternância em que a primeira string está vazia e a segunda é /subfolder; então /root{,/subfolder}produz /roote/root/subfolder
triplicou
Notavelmente este é não portátil para POSIXsh
tripleee
2

Bem, você poderia fazer algo um pouco mais complexo como:

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

Para ver o que isso fará, substitua a chmodchamada por 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
terdon
fonte
1

Não sei o que você está tentando fazer, mas é melhor do que você nãoa recursiva de ânimo leve . Dito isto, leia a resposta real:

Umm ... por que não usar apenas recursivo.

sudo chmod -R +rx /root

Ou, se você não gostar, pode fornecer chmodvários diretórios:

sudo chamod +rx /root /root/subfolder1 /root/subfolder1/subfolder2 /root/subfolder1/subfolder2/subfolderN
Braiam
fonte
3
Essa não é quase a mesma operação, no entanto. chmod -R /rootmuda tudo sob /root- incluindo arquivos regulares e todos os diretórios. A questão é alterar apenas uma cadeia de diretórios.
200_success 14/09/13
@ 200_success mas isso não é a única resposta;)
Braiam
A questão não é sobre recursão, mas como definir permissões em uma cadeia de pastas pai para permitir acesso seletivo a uma subpasta. Dizer que não é a única resposta é como dizer que dirigir um ônibus pela parede é outra maneira de fazer uma porta.
jmc