¿Cómo cambiar la propiedad de enlaces simbólicos?

48

Estoy enfrentando algún problema con la creación de enlaces blandos. El siguiente es el archivo original.

$ ls -l /etc/init.d/jboss
-rwxr-xr-x 1 askar admin 4972 Mar 11  2014 /etc/init.d/jboss

La creación de enlaces falla con un problema de permiso para el propietario del archivo:

ln -sv  jboss /etc/init.d/jboss1
ln: creating symbolic link `/etc/init.d/jboss1': Permission denied

$ id
uid=689(askar) gid=500(admin) groups=500(admin)

Entonces, creé el enlace con privilegios de sudo:

$ sudo ln -sv  jboss /etc/init.d/jboss1
`/etc/init.d/jboss1' -> `jboss'

$ ls -l /etc/init.d/jboss1
  lrwxrwxrwx 1 root root 11 Jul 27 17:24 /etc/init.d/jboss1 -> jboss

Luego intenté cambiar la propiedad del enlace flexible al usuario original.

$ sudo chown askar.admin /etc/init.d/jboss1

$ ls -l /etc/init.d/jboss1
lrwxrwxrwx 1 root root 11 Jul 27 17:24 /etc/init.d/jboss1 -> jboss

Pero el permiso del enlace suave no se está cambiando.

¿Qué me falta aquí para cambiar el permiso del enlace?

Zama Ques
fuente
Qué sistema operativo estás usando?
mjturner
$ cat / etc / redhat-release Red Hat Enterprise Linux Server versión 6.6 (Santiago)
Zama Ques

Respuestas:

69

En un sistema Linux, al cambiar la propiedad de un enlace simbólico usando chown, por defecto cambia el objetivo del enlace simbólico (es decir, lo que sea que apunte el enlace simbólico ).

Si desea cambiar la propiedad del enlace en sí, debe usar la -hopción para chown:

-h, --no-dereference afecta a cada enlace simbólico en lugar de a cualquier archivo referenciado (útil solo en sistemas que pueden cambiar la propiedad de un enlace simbólico)

Por ejemplo:

$ touch test
$ ls -l test*
-rw-r--r-- 1 mj   mj   0 Jul 27 08:47 test
$ sudo ln -s test test1
$ ls -l test*
-rw-r--r-- 1 mj   mj   0 Jul 27 08:47 test
lrwxrwxrwx 1 root root 4 Jul 27 08:47 test1 -> test
$ sudo chown root:root test1
$ ls -l test*
-rw-r--r-- 1 root root 0 Jul 27 08:47 test
lrwxrwxrwx 1 root root 4 Jul 27 08:47 test1 -> test

Tenga en cuenta que el objetivo del enlace ahora es propiedad de root.

$ sudo chown mj:mj test1
$ ls -l test*
-rw-r--r-- 1 mj   mj   0 Jul 27 08:47 test
lrwxrwxrwx 1 root root 4 Jul 27 08:47 test1 -> test

Y nuevamente, el enlace test1aún es propiedad de root, aunque testha cambiado.

$ sudo chown -h mj:mj test1
$ ls -l test*
-rw-r--r-- 1 mj mj 0 Jul 27 08:47 test
lrwxrwxrwx 1 mj mj 4 Jul 27 08:47 test1 -> test

Y finalmente cambiamos la propiedad del enlace usando la -hopción.

mjturner
fuente
Como una tangencial decepcionante: ni cp -asni installni lnpueden crear enlaces simbólicos directamente con un usuario / grupo específico.
Ulrich Schwarz
7

Al actuar sobre enlaces simbólicos, debe indicar a la mayoría de las herramientas (chown, chmod, ls ...) que no desreferencian el enlace: debe agregar el -hparámetro, como se indica en la página de manual:

-h, --no-dereference
          affect symbolic links instead of any referenced file (useful only on systems that can change the ownership of a symlink)

Entonces intenta: sudo chown -h askar.admin /etc/init.d/jboss1

Adrien M.
fuente
1
La respuesta más concisa. La mayoría de la gente viene aquí porque el chown por sí solo no funciona: la "-h" soluciona esto.
itoctopus
4

También tenga en cuenta que el error que dio anteriormente

ln: creating symbolic link `/etc/init.d/jboss1': Permission denied

no se debe a que el propietario del enlace simbólico sea otra persona que no sea el propietario del archivo original. Es (muy probablemente) causado por el usuario askar que no tiene acceso de escritura al directorio /etc/init.d.

Stefan Schmiedl
fuente
Lo imaginé . Falta el permiso de escritura para el grupo
Zama Ques