las respuestas de baraboom y peth son correctas: los bits de permiso en los enlaces simbólicos en sí mismos son irrelevantes (excepto en macOS; ver más abajo), y cambiar el permiso en un enlace simbólico, por la chmod
herramienta de línea de comandos o por la chmod()
llamada al sistema, simplemente actuará como si se realizó contra el objetivo del enlace simbólico.
Para citar la descripción de SUSv4 / POSIX.1-2008 de la llamada al sistema symlink () :
Los valores de los bits de modo de archivo para el enlace simbólico creado no están especificados. Todas las interfaces especificadas por POSIX.1-2008 se comportarán como si el contenido de los enlaces simbólicos se pudiera leer siempre, excepto que el valor de los bits de modo de archivo devuelto en el campo st_mode de la estructura estadística no está especificado.
Aquí, "no especificado" deja margen de interpretación para cada implementación. Detalles específicos:
- En Linux (probado con ext4fs),
stat()
devuelve st_mode=0777
, sin importar cuál era la máscara de usuario cuando se creó el enlace simbólico; ls -l
por lo tanto, siempre se muestra lrwxrwxrwx
para enlaces simbólicos.
- En macOS (HFS) y FreeBSD (UFS y ZFS), un enlace simbólico tiene su propio permiso: el
chmod -h
comando mencionado anteriormente puede cambiar este permiso de enlace (que utiliza internamente una lchown()
llamada al sistema no POSIX para lograr esto), y el stat()
sistema la llamada devuelve este valor para st_mode
.
Los enlaces simbólicos en Linux y FreeBSD siempre se pueden seguir, según lo especificado por POSIX. En particular, en FreeBSD, esto significa que el modo de archivo de un enlace simbólico no tiene ningún efecto en el control de acceso.
Por otro lado, macOS rompe ligeramente POSIX. Aunque se puede seguir un enlace simbólico independientemente de su permiso de lectura, readlink()
falla con EACCES
(Permiso denegado) si el usuario no tiene permiso de lectura:
$ sudo ln -shf target symlink
$ sudo chmod -h 444 symlink
$ ls -l symlink
lr--r--r-- 1 root staff 1 Mar 14 13:05 symlink -> target
$ sudo chmod -h 000 symlink
$ ls -l symlink
ls: symlink: Permission denied
l--------- 1 root staff 1 Mar 14 13:05 symlink
$ echo kthxbye > target
$ cat symlink
kthxbye
(Tenga en cuenta que -> target
falta la parte en la salida del segundo ls -l
comando, y que cat symlink
aún así tuvo éxito e imprimió el contenido del target
archivo a pesar de que el usuario no tenía permiso de lectura symlink
).
NetBSD aparentemente ofrece una opción de montaje especial llamada symperm
que, si se establece, provoca que los permisos de lectura / ejecución de enlaces simbólicos controlen readlink()
y atraviesen los enlaces.