Как сменить владельца с символических ссылок?

49

Я столкнулся с некоторыми проблемами при создании софт-ссылок. Ниже приведен оригинальный файл.

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

Сбой создания ссылки с проблемой разрешения для владельца файла:

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)

Итак, я создал ссылку с привилегиями 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

Далее я попытался сменить владельца софт-ссылки на первоначального пользователя.

$ 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

Но разрешение софт-ссылки не меняется.

Что мне здесь не хватает, чтобы изменить разрешение ссылки?

Зама Кес
источник
Какую операционную систему ты используешь?
mjturner
$ cat / etc / redhat-release Red Hat Enterprise Linux Server, версия 6.6 (Сантьяго)
Zama Ques

Ответы:

71

В системе Linux при изменении владельца символической ссылки с помощью chownпо умолчанию изменяется цель символической ссылки (т. Е. Независимо от того , на что указывает символическая ссылка ).

Если вы хотите сменить владельца самой ссылки, вам нужно использовать -hопцию для chown:

-h, --no-dereference влияет на каждую символическую ссылку вместо любого ссылочного файла (полезно только в системах, которые могут изменить владельца символической ссылки)

Например:

$ 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

Обратите внимание, что цель ссылки теперь принадлежит пользователю 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

И снова, ссылка test1все еще принадлежит пользователю root, хотя testи изменилась.

$ 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

И, наконец, мы меняем владельца ссылки, используя -hопцию.

mjturner
источник
Как неутешительный тангенциальный: ни, ни, cp -asни installне lnмогут напрямую создавать символические ссылки с указанным пользователем / группой.
Ульрих Шварц
7

При работе с символьными ссылками вы должны указать большинству инструментов (chown, chmod, ls ...) не разыменовывать ссылку: вы должны добавить -hпараметр, как указано в man-странице:

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

Так что попробуйте : sudo chown -h askar.admin /etc/init.d/jboss1

Адриен М.
источник
1
Самый краткий ответ. Большинство людей приходят сюда, потому что сам по себе chown не работает - "-h" это исправляет.
итопоп
4

Также обратите внимание, что ошибка, которую вы дали выше

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

не связано с тем, что владелец символической ссылки является кем-то другим, а не владельцем исходного файла. Это (скорее всего) вызвано тем, что у пользователя askar нет прав на запись в каталог /etc/init.d.

Штефан Шмидль
источник
Я понял это. Добавление разрешения на запись для группы отсутствовало
Zama Ques