Cambiar permisos para un enlace simbólico

37

Tengo un enlace simbólico con estos permisos:

lrwxrwxrwx 1 myuser myuser       38 Aug 18 00:36 npm -> ../lib/node_modules/npm/bin/npm-cli.js*

El enlace simbólico se encuentra en un archivo .tar.gz. Ahora, cuando descomprimo el archivo tar.gz usando Maven, el enlace simbólico ya no es válido. Por lo tanto, estoy tratando de reconstruir el enlace simbólico. Primero creo el enlace simbólico usando ln, pero ¿cómo configuro los mismos permisos que el enlace simbólico original?

u123
fuente

Respuestas:

59

Puede crear un nuevo enlace simbólico y moverlo a la ubicación del enlace anterior.

ln -s <new_location> npm2
mv -f npm2 npm

Eso preservará la propiedad del enlace. Alternativamente, puede usar chownpara establecer la propiedad del enlace manualmente.

chown -h myuser:myuser npm

En la mayoría de los sistemas, los permisos de enlaces simbólicos no importan. Cuando se utiliza el enlace simbólico, se verifican los permisos de los componentes del objetivo del enlace simbólico. Sin embargo, en algunos sistemas sí importan. MacOS requiere permiso de lectura en el enlace readlinky la sympermopción de montaje de NetBSD obliga a verificar los permisos de enlace en lectura y recorrido. En esos sistemas (y sus parientes, incluidos FreeBSD y OpenBSD) hay una -hopción equivalente a chmod.

chmod -h 777 npm
JdeBP
fuente
1
Acabo de encontrar un problema de permisos con enlaces simbólicos en un servidor CentOS 6.8. Los enlaces simbólicos tenían propietario: grupo de raíz: raíz. Cuando el propietario y el grupo se cambiaron al usuario que poseía el directorio en el que se encontraban, como se muestra en esta respuesta, el problema de permiso desapareció.
Night Owl
Solo proporciono una aclaración. Para cambiar la propiedad o los derechos de un enlace simbólico, el indicador -h afectará al archivo de enlace simbólico en lugar del archivo desreferenciado.
UltimaWeapon
12

Cuando intenta utilizar chmodpara establecer los permisos del enlace, lo que realmente hace es establecer los permisos del objetivo del enlace. Los permisos del enlace no tienen sentido.

Simplemente hazlo
fuente
2
¿Qué pasa si alguien cambia el enlace a un código malicioso? El código original incluso puede ser algo a lo que la raíz solo puede acceder. Por ejemplo en crontap scripts.
aliqandil
@aliqandil Generalmente, un usuario puede eliminar y volver a crear cualquier archivo en un directorio para el que tiene acceso de escritura. En bash, para un archivo testcon -rw-rw-r-- root root, porque rm testrecibo el mensaje rm: remove write-protected regular empty file 'test'?La solución es colocar archivos confidenciales en directorios para los que los usuarios tienen acceso de solo lectura.
AnOccasionalCashew
5

Cuando tienes un enlace como:

link -> foo/bar

y quiero cambiarlo a:

link -> new/target

Hay dos casos a considerar:

  1. foo/barno es un directorio o no existe o no tiene acceso de búsqueda foo. Luego

    ln -s new/target link
    

    fallará porque linkya existe, pero puede superarlo utilizando el estándar:

    ln -fs new/target link
    
  2. foo/bares un directorio (y tiene permiso de búsqueda foopara poder determinar que foo/bares un directorio). En ese caso, cuando haces:

    ln -s new/target link
    

    o

    ln -fs new/target link
    

    Se entiende como crear un nuevo targetenlace simbólico dentro del linkdirectorio ( linkes un directorio porque es un enlace simbólico al foo/bardirectorio). Entonces realmente crearás un:

    foo/bar/target -> new/target
    

    Para superar eso, GNU lntiene una -Topción para que el nombre del enlace se considere siempre como el nombre del enlace, y no como un directorio para crear los enlaces. Entonces, con GNU ln:

    ln -fsT new/target link
    

    trabajará. Al igual que antes, eliminará el linkenlace simbólico original y lo creará de nuevo con new/targetel objetivo (y el proceso 'euid y egid como propietario).

    GNU lntambién tiene una -nopción. Funciona como, -Texcepto cuando en linkrealidad es un directorio real, en cuyo caso aún creará el enlace simbólico dentro de ese directorio (en lugar de fallar con un error).

    Portablemente, su mejor opción es eliminar primero el enlace y luego volver a crearlo:

    rm -f link && ln -s new/target link
    

En la mayoría de los sistemas, los permisos en los enlaces simbólicos se ignoran y generalmente se fijan en rwxrwxrwx.

En los sistemas donde los permisos de enlaces simbólicos son importantes (como OS / X donde necesita permiso de lectura para un enlace simbólico para poder resolver su objetivo), generalmente hay una manera de cambiarlos ( chmod -hen OS / X).

La propiedad, si bien como anteriormente no es relevante para el acceso al archivo señalado por el enlace simbólico en la mayoría de los sistemas, puede tener alguna otra relevancia con el tbit del directorio principal o las cuotas ... ) y hay un comando estándar para cambiarlo:

chown -h user[:group] the-link
chgrp -h group the-link
Stéphane Chazelas
fuente
0

Si realmente necesita cambiar el permiso de enlaces simbólicos (generalmente sin sentido, como está escrito en otras respuestas), tuve éxito al usar la -Ropción de chown:

chown -R myuser:mygroup link

Si -Rno se usó, los permisos no se modificaron.

Miroslav Mocek
fuente
Eso funcionará con GNU chownporque está -Rimplícito -Pallí, sin embargo, eso no está garantizado y no funcionará en otras implementaciones conocidas. La forma estándar de cambiar la propiedad del enlace simbólico es con la -hopción. Acabo de actualizar la respuesta aceptada que era incorrecta.
Stéphane Chazelas