Como alterar a propriedade de links simbólicos?

19

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

Em seguida, tentei alterar a propriedade do link 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 falta aqui para alterar a permissão do link?

    
por Zama Ques 27.07.2015 / 09:40

3 respostas

26

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 (isto é, qualquer que seja o link simbólico apontando para ).

Se você quiser alterar a propriedade do próprio link, precisará usar a opção -h para chown :

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

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 ao 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

E, novamente, o link test1 ainda é de propriedade de root, mesmo que test tenha 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

Finalmente, alteramos a propriedade do link usando a opção -h .

    
por 27.07.2015 / 09:55
3

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

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

não é devido ao proprietário do link simbólico ser alguém que não seja o proprietário do arquivo original. É (muito provavelmente) causado pelo usuário não ter acesso de gravação ao diretório /etc/init.d .

    
por 27.07.2015 / 16:00
2

Ao agir sobre links simbólicos, você deve informar a maioria das ferramentas (chown, chmod, ls ...) para não desreferenciar o link: você deve adicionar o parâmetro -h , conforme indicado na manpage:

-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

    
por 27.07.2015 / 09:52