我在创建软链接时遇到一些问题。以下是原始文件。
$ 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
但软链接的权限没有改变。
我在这里缺少什么来更改链接的权限?
答案1
在 Linux 系统上,当使用 更改符号链接的所有权时chown
,默认情况下它会更改目标符号链接(即无论符号链接指向什么)。
如果您想更改链接本身的所有权,则需要使用-h
以下选项chown
:
-h, --无取消引用 影响每个符号链接而不是任何引用的文件(仅在可以更改符号链接所有权的系统上有用)
例如:
$ 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
。
答案2
当对符号链接进行操作时,您必须告诉大多数工具(chown、chmod、ls...)不要取消引用链接:您必须添加参数-h
,如联机帮助页中所述:
-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
答案3
另请注意您上面给出的错误
ln: creating symbolic link `/etc/init.d/jboss1': Permission denied
不是因为符号链接的所有者不是原始文件的所有者。它(很可能)是由用户 askar 没有对该目录的写访问权限引起的/etc/init.d
。