Digamos que tienes esta estructura:
+ directory
-- file1
-- file2
-- file3 -> /tmp/file3
file3
es un enlace a otro file3
en otro lugar del sistema.
Ahora digamos que chmod 777
el directorio y todos los contenidos dentro de él. ¿Mi file3
en /tmp
recibir los permisos? Además, digamos que tenemos la misma situación pero invertida.
/tmp/file3 -> /directory/file3
Si aplico los permisos en el archivo al que está vinculado, ¿cómo afecta eso al enlace?
Respuestas:
Depende de cómo llame
chmod
y la plataforma en la que se esté ejecutando.Por ejemplo, en un sistema Linux,
man chmod
dice esto:Sin embargo, en una Mac, chmod se puede usar para modificar los permisos de un enlace simbólico usando opciones como esta (desde
man chmod
):Por el bien de ejemplo, supongamos que está en una máquina Linux para el resto de esta respuesta.
Si en el primer caso se ejecuta
chmod -R 777 directory
para cambiar recursivamente los permisos, el destino del enlace no se verá afectado, pero si lo hacechmod 777 directory/*
, lo hará.Si cambia los permisos en el destino del enlace directamente, esos permisos se mantendrán (ya que, como dicen la página de manual y baraboom , los permisos de enlace reales no se usan para nada).
Registro de prueba para ilustración:
fuente
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 lachmod()
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 () :
Aquí, "no especificado" deja margen de interpretación para cada implementación. Detalles específicos:
stat()
devuelvest_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 muestralrwxrwxrwx
para enlaces simbólicos.chmod -h
comando mencionado anteriormente puede cambiar este permiso de enlace (que utiliza internamente unalchown()
llamada al sistema no POSIX para lograr esto), y elstat()
sistema la llamada devuelve este valor parast_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 conEACCES
(Permiso denegado) si el usuario no tiene permiso de lectura:(Tenga en cuenta que
-> target
falta la parte en la salida del segundols -l
comando, y quecat symlink
aún así tuvo éxito e imprimió el contenido deltarget
archivo a pesar de que el usuario no tenía permiso de lecturasymlink
).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 controlenreadlink()
y atraviesen los enlaces.fuente
fuente