How to change ownership of symbolic links?

162,650

Solution 1

On a Linux system, when changing the ownership of a symbolic link using chown, by default it changes the target of the symbolic link (ie, whatever the symbolic link is pointing to).

If you'd like to change ownership of the link itself, you need to use the -h option to 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)

For example:

$ 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

Note that the target of the link is now owned by 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

And again, the link test1 is still owned by root, even though test has changed.

$ 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

And finally we change the ownership of the link using the -h option.

Solution 2

When acting on symlinks, you must tell most of the tools (chown, chmod, ls...) not to dereference the link: you must add the -h parameter, as stated in the manpage :

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

So try : sudo chown -h askar.admin /etc/init.d/jboss1

Solution 3

Also note that the error you gave above

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

is not due to the owner of the symlink being somebody else than the owner of the original file. It is (most probably) caused by user askar not having write access to the directory /etc/init.d.

Share:
162,650

Related videos on Youtube

user3744406
Author by

user3744406

Updated on September 18, 2022

Comments

  • user3744406
    user3744406 over 1 year

    I am facing some issue with creating soft links. Following is the original file.

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

    Link creation is failing with a permission issue for the owner of the file:

    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)
    

    So, I created the link with sudo privileges:

    $ 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
    

    Next I tried to change the ownership of the soft link to the original user.

    $ 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
    

    But the permission of the soft link is not getting changed.

    What am I missing here to change the permission of the link?

    • user3744406
      user3744406 almost 9 years
      $ cat /etc/redhat-release Red Hat Enterprise Linux Server release 6.6 (Santiago)
  • user3744406
    user3744406 almost 9 years
    I figured that . Adding write permission for group was missing
  • Ulrich Schwarz
    Ulrich Schwarz almost 6 years
    As a disappointing tangential: neither cp -as nor install nor ln can directly create symlinks with a specified user/group.
  • itoctopus
    itoctopus about 5 years
    The most concise answer. Most people come here because chown by its own doesn't work - the "-h" fixes this.
  • Harry
    Harry over 3 years
    Any option to change the permission of the link and target at the same time?
  • edwardsmarkf
    edwardsmarkf over 2 years
    THANK YOU so much for including "--no-dereference" and not just assuming everybody knows what "-h" is. some of us are not born knowing what the cryptic switches mean!