Como alterar a propriedade dos links simbólicos?

47

Estou enfrentando algum problema com a criação de links flexíveis. A seguir está o arquivo original.

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

A criação do link está falhando com um problema de permissão para o proprietário do arquivo:

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)

Então, eu criei o link com privilégios 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

Em seguida, tentei alterar a propriedade do link virtual para o usuário 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

Mas a permissão do link não está sendo alterada.

O que estou perdendo aqui para alterar a permissão do link?

Zama Ques
fonte
Qual sistema operacional você está usando?
Mjturner
$ cat / etc / redhat-release Servidor 6.6 do Red Hat Enterprise Linux, versão 6.6 (Santiago)
Zama Ques

Respostas:

68

Em um sistema Linux, ao alterar a propriedade de um link simbólico usando chown, por padrão, ele altera o destino do link simbólico (ou seja, o que o link simbólico está apontando ).

Se você deseja alterar a propriedade do próprio link, precisa usar a -hopção para chown:

-h, --no-dereference afetar cada ligação simbólica em vez de qualquer arquivo referenciado (útil somente em sistemas que podem alterar a propriedade de um link simbólico)

Por exemplo:

$ 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

Observe que o destino do link agora pertence à raiz.

$ 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

E, novamente, o link test1ainda pertence à raiz, embora testtenha mudado.

$ 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

E, finalmente, alteramos a propriedade do link usando a -hopção

mjturner
fonte
Como uma tangencial decepcionante: nem cp -asnem installnem lnpodemos criar links simbólicos diretamente com um usuário / grupo especificado.
Ulrich Schwarz
7

Ao atuar em links simbólicos, você deve informar a maioria das ferramentas (chown, chmod, ls ...) para não desreferenciar o link: você deve adicionar o -hparâmetro, conforme indicado na 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)

Então tente : sudo chown -h askar.admin /etc/init.d/jboss1

Adrien M.
fonte
1
A resposta mais concisa. A maioria das pessoas vem aqui porque o chown por si só não funciona - o "-h" corrige isso.
itoctopus 28/02
4

Observe também que o erro que você deu acima

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

não se deve ao fato de o proprietário do link simbólico ser outra pessoa que não o proprietário do arquivo original. É (provavelmente) causado pelo usuário askar não ter acesso de gravação ao diretório /etc/init.d.

Stefan Schmiedl
fonte
Eu percebi isso. Permissão de escrita acrescentando para o grupo estava faltando
Zama Ques