Cambiar permisos sólo a directorios (SOLUCIONADO)

Imagen de paradeiso
0 puntos

Hola a todos,

Resulta que necesito saber la forma con la que poder cambiar los permisos de un árbol de directorios de forma recursiva, pero que este cambio de permisos sólo afecte a los directorios, y no a los archivos.

La cosa está en que tengo unos discos externos en sistema de archivos ext3 compartidos por samba con varios usuarios en la red, y dado que tengo un montonazo de directorios y subdirectorios en dicho disco externo, me tiraría 3 vidas cambiando permisos directorio por directorio. Dado que tengo mucha información ya introducida, quiero ponerle el bit SGID a los directorios, para que hereden el grupo, pero evidentemente no a los archivos, pues con ello conseguiría un gran agujero de seguridad.

Muchas gracias a todos.

Imagen de paradeiso
+1
0
-1

Vale, me contesto a mí mismo xD xD

Resulta que he estado googleando, y he encontrado una forma de hacer que una orden de consola acepte otra como entrada, es decir, crear un subshell. Esto puede parecerse a usar un pipe, pero así nunca he sido capaz de conseguirlo.

Por tanto, para mi situación, si quiero atribuirle el permiso SGID a un árbol de directorios pero sólo a los directorios y no a los archivos, ejecuto esta instrucción:

sudo chmod g+s `find ./directorio/ -type d`

Con esta orden, consigo que la sentencia chmod acepte como entrada la sentencia find. Esto se consigue con las comillas inversas, que pueden escribirse pulsando la tecla de la potencia, es decir, la que está justo a la derecha de la letra P (hay que pulsarla dos veces). La orden find tiene como primer argumento el directorio donde vas a realizar la búsqueda, y el segundo argumento (en este caso en concreto) es una intrucción que restringe la búsqueda a sólo directorios; si quisiéramos ficheros únicamente habría que cambiar la "d" por la "f".

En fin, que lo cuento para quién le haya venido la curiosidad.

Un saludo, y gracias a todos.

+1
0
-1
Imagen de slap
+1
0
-1

Gracias a tí por compartir la solución. ;)

Saludos.


0000 start out (+FD),A
           ld  BC, +7FFF
           jp 03CB, RAM-CHECK

http://7grados.injiniero.es

+1
0
-1

Saludos.

0000 start out (+FD),A
           ld  BC, +7FFF
           jp 03CB, RAM-CHECK

http://www.injiniero.es

Imagen de paradeiso
+1
0
-1

Bueno, ahora el problema está en que si ejecuto la siguiente instrucción:

sudo chmod -R g+s `find ./directorio/ -type d`

Lo hace correctamente exceptuando los directorios que tienen espacios. Lo he probado también volcando la orden find a un fichero y luego pasarle al chmod como entrada la orden "cat fichero" pero el problema persiste.

¿Alguna idea para solucionar este problemilla? La verdad es que esto es muy frustrante.... ;-)

+1
0
-1
Imagen de slap
+1
0
-1

¿Conoces el uso de xargs?

Puedes probar con:

find ./directorio/ -type d -print0 | xargs -0 chmod -R g+s

Más info:

man xargs

Saludos.


0000 start out (+FD),A
           ld  BC, +7FFF
           jp 03CB, RAM-CHECK

http://7grados.injiniero.es

+1
0
-1

Saludos.

0000 start out (+FD),A
           ld  BC, +7FFF
           jp 03CB, RAM-CHECK

http://www.injiniero.es

Imagen de slap
+1
0
-1

Una observación:

Si usas la opción -R con chmod cambiarás los permisos también a los archivos de forma recursiva en cada directorio que encuentre find !!!

(Creo que no querías hacer eso)

Saludos.


0000 start out (+FD),A
           ld  BC, +7FFF
           jp 03CB, RAM-CHECK

http://7grados.injiniero.es

+1
0
-1

Saludos.

0000 start out (+FD),A
           ld  BC, +7FFF
           jp 03CB, RAM-CHECK

http://www.injiniero.es

Imagen de paradeiso
+1
0
-1

Gracias por tu respuesta, slap!

Pues precisamente de eso se trata, quiero poner el bit SETGID a todos los directorios Y SUBDIRECTORIOS de un árbol de directorios, por ello uso la opción -R. De lo que se trata por tanto, es de excluir los ficheros de ese cambio de permisos, y para ello uso la orden find, para que retorne únicamente los directorios y no los archivos. Con la opción -type d únicamente retorna los directorios.

No obstante, he encontrado algo curioso que hace lo que yo quiero de una forma un poco brusca. El hecho es que si ejecuto la siguiente orden:

sudo chmod -R 2750 directorio

y luego ejecuto la siguiente orden:

sudo chmod -R 0750 directorio

resulta que los permisos de todo el árbol de directorios, en contra de lo que pueda parecer, no se quedan como estaban. En vez de ello, los archivos se quedan en su estado original, esto es, con el bit SETGID desactivado, y en cambio los directorios se quedan con el bit SETGID activo. Es una forma un poco bastante brusca de hacerlo, y ciertamente no sé por qué funciona así, pero el hecho es que funciona!! xD

Voy a probar en seguida la nueva orden esa de la que me has hablado, y os cuento.

Muchas gracias de nuevo!!

+1
0
-1
Imagen de paradeiso
+1
0
-1

Hola de nuevo :-(

No funciona tu solución, slap. Con esa orden exacta no da problemas en el sentido de que no arroja mensajes de error cuando procesa nombres de ficheros con espacios, pero el resultado no es el esperado, ya que añade el bit SGID también a los ficheros.

He probado a ejecutar esta orden:

find ./directorio/ -type d -print0 

y la lista que imprime por pantalla es correcta, pero por alguna razón que desconozco el comando xargs no la procesa bien.

Es curioso que también he probado a hacer lo siguiente, con el objeto de ver si la información es arrojada correctamente sobre un fichero:

find ./directorio/ -type d -print0 > fichero

Y el resultado de hacer more fichero es "." sin las comillas, es decir, que no arroja bien la información sobre el fichero. Por lo tanto, y en definitiva, se produce un chmod recursivo sobre el directorio ".", y evidentemente se establece el bit SETGID en todos los elementos, ya sean ficheros o directorios.

¿Cómo puedo solucionar este problema?

Muchas gracias de nuevo.

+1
0
-1
Imagen de slap
+1
0
-1

Hola.
2 cosas:
Si el comando:

find ./directorio/ -type d -print0 

Te imprime por pantalla la lista correcta, si rediriges la salida a un fichero, el contenido del fichero debe ser lo mismo que obtenías por pantalla.
A no ser que los dos comandos los estés lanzando desde directorios diferentes. Ten en cuenta que al poner ./fichero/ estás tomando el directorio actual (desde donde lanzas el comando) como directorio de partida para find.

La segunda cuestión, y que ya te advertí en una observación anterior, es que si usas -R con chmod, cambiarás los permisos recursivamente tanto a directorios como a ficheros.

El problema es el siguiente:
El comando find entrega a xargs un directorio cada vez y sobre ese directorio haces un chmod -R ... con lo que el cambio de permisos será recursivo sobre ficheros y directorios a partir del directorio que le entregó find porque TÚ se lo has dicho así a chmod con el -R. Es un poco enrevesado de explicar pero creo que se entiende.

Si sólo quieres actuar sobre directorios, no debes usar -R en chmod y como find actúa recursivamente el chmod se hará en TODOS los directorios y subdirectorios que se encuentren por debajo de ./directorio/

Debes usar el comando:

find ./directorio/ -type d -print0 | xargs -0 chmod g+s

Sin el -R

Yo lo he probado y funciona correctamente.

Saludos.


0000 start out (+FD),A
           ld  BC, +7FFF
           jp 03CB, RAM-CHECK

http://7grados.injiniero.es

+1
0
-1

Saludos.

0000 start out (+FD),A
           ld  BC, +7FFF
           jp 03CB, RAM-CHECK

http://www.injiniero.es

Imagen de paradeiso
+1
0
-1

Slap, definitivamente eres un genio. El problema residía en el -R, y tal y como tú dices debo quitárselo. Yo estaba empeñado en poner el -R porque en la orden inicial que había puesto yo sí que había que ponérselo.

Pero pensándolo detenidamente tienes toda la razón, y tu explicación está clarísima. El comando find lista todos los directorios Y TAMBIÉN SUBDIRECTORIOS, algo en lo que yo no había caído.

Te agradezco enormemente tu ayuda, slap. Que gran comunidad para que gran sistema operativo.

Muchas gracias, y saludos cordiales.

EDITO: una aclaración para quién desee intentarlo "en casa" ;-) El problema de ejecutar la siguiente orden:

find ./directorio/ -type d -print0 | xargs -0 chmod g+s 

es que se está haciendo un cambio de permisos sin ser superusuario. Para un cambio normal y corriente, no hay problema. Pero parece ser, al menos en mi equipo, que para añadir el bit SETGID es necesario ser superusuario, por lo que la orden correcta sería:

find ./directorio/ -type d -print0 | xargs -0 sudo chmod g+s

Eso o ejecutarla con id de root. Pero lo que no funciona, y lo he probado muchas veces, es poner un sudo al principio únicamente.

Saludos

+1
0
-1
Imagen de slap
+1
0
-1

Si tienes que usar sudo es porque el usuario con el que lanzas el comando no es el mismo que el propietario de los ficheros/directorios a los que le aplicas el chmod.

Otra cosa:
El comando que comentabas antes:

sudo chmod -R 2750 directorio

y

sudo chmod -R 0750 directorio

efectivamente el último comando no restaura el sgid en los directorios. Por lo que he leído, el uso de la forma octal para resetear los permisos especiales (suid, sgid y sticky) no afecta a los directorios. Hay que hacerlo de manera simbólica, por ejemplo con g+s y g-s.

Saludos.


0000 start out (+FD),A
           ld  BC, +7FFF
           jp 03CB, RAM-CHECK

http://7grados.injiniero.es

+1
0
-1

Saludos.

0000 start out (+FD),A
           ld  BC, +7FFF
           jp 03CB, RAM-CHECK

http://www.injiniero.es

Imagen de paradeiso
+1
0
-1

Pues te parecerá raro, slap, pero el caso es que sí que soy el propietario de los archivos a los que intento aplicar el bit SETGID. De hecho, todos los de mi servidor samba son de mi propiedad, y el grupo de todos ellos es un grupo que he creado específicamente para que los demás usuarios de la red tengan acceso al menos de lectura.

Lo raro es si hago un cambio de permisos normal y corriente, por ejemplo un chmod 750, no da ningún problema. En cambio, si ejecuto la orden chmod g+s sin el sudo delante, parece como que acepta la orden ya que no devuelve ningún error, pero miro el resultado y los permisos no han cambiado. Es muy raro... Y no creo que tenga nada que ver que estos ficheros estén un varios discos externos en sistemas de archivos ext3...

Y en cuanto a lo de los bits especiales, muchas gracias por la aclaración, ahora ya sé que no tengo que perder más tiempo con la forma octal a la hora de establecer bits especiales.

Por cierto, la orden xargs que me has comentado me está funcionando de maravilla. Con ella he creado una tarea automatizada que mantiene siempre los permisos y atributos de los ficheros y directorios siempre en su sitio. Muchas gracias de nuevo por esa inestimable ayuda.

Saludos ;-)

+1
0
-1
Imagen de pokepasa
+1
0
-1

Bueno llevo un par de dias probando y tal y la siguiente linea me funciona en linea de comandos pero no en Script;
Lo del print0 y -0 es para los espacios en blanco de carpetas y archivos.
El problema de los espacios en blanco en el nombre, me lo hace bien en linea de coamando pero no quando lo meto en un Script me peta en el find con los archivos que tienen algún espacio en blanco.

find ./ -type f -print0 | xargs -0 chmod 644

Alguna sugerencia?

+1
0
-1

Banner.cat directorio de banners, publicidad Web
Ir al directorio de banners: banner.cat