establecer permisos de lectura y escritura para la carpeta y todos sus directorios principales

18

Necesito establecer permisos de lectura y escritura para el rootusuario al directorio subfolderNy todas sus carpetas principales hasta root.

Puedo hacerlo a mano:

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

Pero si Nes grande estoy cansado. ¿Cómo hacer automáticamente por un comando?

Maxim Yefremov
fuente
Realmente no deberías hacer que el /rootmundo sea legible.
Stéphane Chazelas

Respuestas:

23

Esto se puede hacer fácilmente en el shell, comenzando en el subdirectorio y subiendo:

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

Esto comienza con cualquier archivo / directorio que establezca f también, y funciona en cada directorio padre, hasta que encuentre "/" (o lo que establezca la cadena en la condición del bucle). No chmod "/".

Submarino alado
fuente
Bien, sabía que estaba complicando las cosas innecesariamente con Perl.
terdon
Pero, ¿qué fpasa si es un camino relativo y quiero detenerme en lo que es relativo en lugar de /?
StackExchange for All
@ StéphaneChazelas Gracias. Si $fes así foo/bar, ¿ $falguna vez cambiará a .? Si lo dirnamehace Gracias
StackExchange para todos
1
@Tim convierte la ruta relativa a la ruta absoluta antes de almacenar en f usando el 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;}

O podría definir una función de calificador global como:

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

Para ser utilizado por ejemplo como:

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

Tenga en cuenta que chmod +rxse ve afectado por la umask. Si su umaskno incluye 007, haría que el /rootdirectorio sea legible y accesible en todo el mundo, lo cual es una mala idea. /rootes típicamente para las cosas privadas del superusuario, es una mala idea exponerlo.

Stéphane Chazelas
fuente
Podría explicar lo que la lleva ,en {,/subfolder}sí?
terdon
Crea una alternancia donde la primera cadena está vacía y la segunda es /subfolder; así /root{,/subfolder}produce /rooty/root/subfolder
triplicado
En particular, esto no es portátil para POSIXsh
tripleee
2

Bueno, podrías hacer algo un poco más complejo como:

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

Para ver qué hará esto, reemplace la chmodllamada 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
terdon
fuente
1

No sé qué estás tratando de hacer, pero es mejor que no tomes el recursivo a la ligera . Dicho esto, lea la respuesta real:

Umm ... ¿por qué no usar recursivo?

sudo chmod -R +rx /root

O si no te gusta, puedes dar chmodvarios directorios:

sudo chamod +rx /root /root/subfolder1 /root/subfolder1/subfolder2 /root/subfolder1/subfolder2/subfolderN
Braiam
fuente
44
Sin embargo, esa no es la misma operación. chmod -R /rootcambia todo debajo /root, incluidos los archivos normales y todos los directorios. La pregunta es sobre cambiar solo una cadena de directorios.
200_success
@ 200_success pero esa no es la única respuesta;)
Braiam
La pregunta no es acerca de la recursividad, sino cómo establecer permisos en una cadena de carpetas principales para permitir el acceso selectivo a una subcarpeta. Decir que no es la única respuesta es como decir que conducir un autobús a través de la pared es otra forma de hacer una puerta.
jmc