El problema con chmod

chmod es uno de esos comandos que muy pocas veces uso. Para los que no sepan, chmod sirve para cambiar los que cada usuario tiene sobre un archivo. Hay más de una manera de establecer dichos permisos, pero en mi caso, viniendo de un entorno web y del uso de FTP, me gusta usar permisos del tipo 777 (Todos los clientes FTP que he usado usan esta forma de registrar permisos). Personalmente no me gusta el 777 y me inclino más por 664.

Que significan esos números?

El sistema asigna un numero a cada tipo de acción que un usuario puede llevar a cabo en un archivo determinado. 4 es para lectura, 2 para escritura y 1 para indicar que el archivo en cuestión puede ser ejecutado como programa. De este modo, si queremos que un archivo pueda ser leido y modificado necesitamos 4 para lectura y 2 para escritura; 4 + 2 =6. Para indicar dichos permisos usamos 6. Si queremos que un archivo pueda ser leido, pero no ejecutado ni modificado, entonces solo necesitamos 4. Si queremos que un archivo pueda ser leido, modificado y ejecutado, necesitamos los 3 permisos para un total de 7 (4 +2 +1 = 7)

Ahora, por que 3 numeros?

Como puedes ver, los permisos se establecen usando 3 números (de hecho se pueden establecer más propiedades como si el archivo es sticky o no). Estos 3 numeros pertenecen a los 3 tipos de usuario de un sistema linux: Usuario, Grupo, Otros.

Usuario se refiere al usuario deño del archivo en cuestión. Grupo se refiere a otros usuarios pertenecientes al grupo del cual el archivo es miembro. Otros se refiere a todos los demás usuarios. De este modo si queremos que un archivo pueda ser:

Leido y modificado por el dueño del archivo en cuestion
Leido y modificado por usuarios pertenecientes al grupo del cual el archivo es miembro
Leido por todos los demás usuarios

En este caso usariamos 664. El primer 6 establece permisos de lectura y escritura para el dueño del archivo, el segundo 6 establece permisos de lectura y escritura para el grupo al cual pertenece el archivo, y el 4 del final establece permisos de lectura para otros usuarios.

Asta ahora todo bien, entonces donde está el problema?

El problema es que si a un archivo le especificas que puede ser ejecutado, cada vez que quieras abrirlo pudiera ser que tu sistema te pregunte si deseas ejecutarlo o mostrarlo. Esto se buelve molesto y quita tiempo después de unas cuantas veces. Si el archivo en cuestión es uno que estás modificando constantemente, quizá no quieras que tu sistema te pregunte a cada rato que es lo que quieres hacer con dicho archivo.

La solución por supuesto es sencilla, en lugar de 7, usamos 6. Por ejemplo, si los permisos eran 774, los cambiamos a 664. Pero que pasa cuando tenemos todo un projecto que por ciertas razones tiene permisos indeseados? Ya sea que no tiene los suficientes permisos o tiene permisos de más.

Considera un projecto que esta dividido en folders, cada folder contiene varios archivos y probablemente más folders. En mi caso estoy con un projecto de más de 500 archivos. Como cambio los permisos de todos esos archivos sin tener que ir uno por uno?

La respuesta es simple (o tal vez no). Al comando chmod podemos ponerle una banderita de modo que sea recursivo. Por ejemplo:

chmod -R 664 miFolder/

Esto va a establecer permisos a todos los archivos dentro de miFolder y es multinivel. Pero una vez lo ejecutas, te encuentras con un error de acceso. Hay archivo que no pudieron ser accesados. Y si vas a tu navegador de archivos, ahora ya no puedes abrir las carpetas. Result que para las carpetas, el permiso de ejecución significa otra cosa. Más concretamente, significa que la carpeta puede ser explorada, y lo que hicimos fué revocar ese permiso. Ahora nuestra carpeta no puede ser explorada. Y ese es precisamente el problema.

Como revoco permisos de ejecución en solo archivos y no carpetas?

Después de probar con algunas convinaciones, llegué a la solución:

chmod -R -x+X miFolder/

Lo que hacemos aquí es sencillo primero revocamos permisos de ejecución en a todos los archivos, incluyendo carpetas. Luego, con X asignamos permisos de ejecución solo a archivos que ya tenían permisos de ejecución y a Carpetas. En nuestro caso solo carpetas son asignadas permisos de ejecución (o exploración en su caso) ya que previamente revocamos permisos de ejcución a todos los archivos.

De esta manera hemos resuelto nuestro problema con un solo comando sin importat la cantidad de archivos con los que estemos tratando.