Al utilizar las herramientas chown
y chmod
para cambiar los atributos de un archivo o directorio, los enlaces simbólicos son procesados por el sistema de archivos como cualquier otro acceso. Por ende terminamos cambiando permisos sobre el target o destino del enlace simbólico. Pero ¿qué pasa si necesitamos cambiar permisos del enlace simbólico propiamente dicho? La respuesta está en las manpages.
En los sistemas FreeBSD, tanto chown
como chmod
incluyen la opción -h
, la cual posee la siguiente funcionalidad:
De la página de manual de chown
:
-h If the file is a symbolic link, change the user ID and/or the group ID of the link itself.
De la página de manual de chmod
:
-h If the file is a symbolic link, change the mode of the link itself rather than the file that the link points to.
Esto es, si el archivo es un link simbólico, cambiar el ownership/modo del link en sí mismo más que del archivo al cual apunta.
Veamos un ejemplo. Tenemos un enlace simbólico, link
, que apunta a un archivo, archivito
:
root@hal9000:/tmp # ll link archivito -rw-r--r-- 1 root staff 0 Nov 23 08:02 archivito lrwxr-xr-x 1 root wheel 9 Nov 23 08:03 link@ -> archivito
El enlace es propiedad de root:wheel
y el target de root:staff
.
Supongamos que deseamos que el enlace sea propiedad de emi:wheel
:
root@hal9000:/tmp # chown emi:wheel link root@hal9000:/tmp # ll link archivito -rw-r--r-- 1 emi wheel 0 Nov 23 08:02 archivito lrwxr-xr-x 1 root wheel 9 Nov 23 08:03 link@ -> archivito
Al ejecutar chown
sobre el enlace, se cambian los permisos del target en lugar del enlace en sí. Para cambiar los permisos del enlace es necesario agregar la opción -h
.
Primero restauro los permisos originales sobre el target:
root@hal9000:/tmp # chown root:staff archivito root@hal9000:/tmp # ll link archivito -rw-r--r-- 1 root staff 0 Nov 23 08:02 archivito lrwxr-xr-x 1 root wheel 9 Nov 23 08:03 link@ -> archivito
Luego cambiar los permisos sobre el enlace (lo cual era nuestra intención original) utilizando -h
:
root@hal9000:/tmp # chown -h emi:wheel link root@hal9000:/tmp # ll link archivito -rw-r--r-- 1 root staff 0 Nov 23 08:02 archivito lrwxr-xr-x 1 emi wheel 9 Nov 23 08:03 link@ -> archivito
Se observa que con la opción -h
se cambian los permisos del enlace pero no del destino.
Lo mismo ocurre para el comando chmod
.
En los sistemas GNU/Linux este comportamiento difiere, ya que la opción -h
sólo es válida para chown
. Esto es, cambiar el usuario o grupo dueños del archivo o directorio. Sin embargo no es posible cambiar los permisos en un enlace simbólico, ya que siempre se computan los del target.