例如,我有 foo.sh 的 770 权限。当我做:
ln -s foo.sh bar.sh
链接 bar.sh 有 2777 个权限。为什么是这样?我以为他们注定要被继承?
符号链接的权限在很大程度上无关紧要。它们通常是由 umask 设置修改的 777。
POSIX 标准symlink()
说:
创建的符号链接的文件模式位的值未指定。POSIX.1-2008 指定的所有接口都应该表现得好像符号链接的内容总是可以读取,除了
st_mode
在 stat 结构的字段中返回的文件模式位的值是未指定的。
POSIX 提供lchown()
系统调用;它不提供功能。lchmod()
(在我的 MacOS X 10.7.1 上,使用 umask 022,新创建的符号链接以 755 权限结束;使用 umask 002,权限以 775 结束。因此,使用 770、700 等权限创建链接的观察结果可能是准确;权限设置仍然无关紧要,不会影响符号链接的可用性。)
在 Linux(用于 x86_64 的 RHEL 5;内核 2.6.18-128.el5)上,我只能在创建符号链接时看到 777 权限:
$ (ls -l xx.pl; umask 777; ln -s xx.pl pqr; ls -l xx.pl pqr)
-rw-r--r-- 1 jleffler rd 319 2011-09-05 22:10 xx.pl
lrwxrwxrwx 1 jleffler rd 5 2011-09-21 10:16 pqr -> xx.pl
-rw-r--r-- 1 jleffler rd 319 2011-09-05 22:10 xx.pl
$
我在子外壳中运行它,因此 umask 设置不是永久性的。
在 MacOS X (10.7.1) 上,我可以看到符号链接上的可变权限:
$ (ls -l xxx.sql; umask 777; ln -s xxx.sql pqr; ls -l xxx.sql pqr)
-rw-r--r-- 1 jleffler staff 1916 Jun 9 17:15 xxx.sql
ls: pqr: Permission denied
l--------- 1 jleffler staff 7 Sep 21 10:18 pqr
-rw-r--r-- 1 jleffler staff 1916 Jun 9 17:15 xxx.sql
$
请注意,这是链接到的相同命令序列(提供或获取文件名)。
在 MacOS X 上,该chmod
命令具有-h
更改符号链接本身权限的选项:
-h
如果文件是符号链接,请更改链接本身的模式,而不是链接指向的文件。
在 MacOS X 上,符号链接的权限很重要;除非您对符号链接具有读取权限(或者您是 root),否则您无法读取符号链接。因此ls
上面的输出中的错误。并且readlink
失败了。等等。
在 MacOS X 上,chmod -h 100 pqr
(执行)允许我使用链接(cat pqr
有效)但不能阅读链接。相比之下,chmod -h 400 pqr
允许我阅读链接和使用链接。为了完整起见,chmod -h 200 pqr
允许我使用该链接但不能阅读它。我假设,未经正式测试,类似的规则适用于组和其他。
那么,在 MacOS X 上,似乎对符号链接的读取或写入权限允许您正常使用它,但单独执行权限意味着您无法找到链接指向的位置(readlink(2)
失败),即使您可以访问文件(或者,大概,目录)在链接的另一端。
MacOS X 行为是 POSIX 规定的行为的扩展——或偏离 POSIX 规定的行为。它使生活稍微复杂化。这意味着您必须确保应该使用该链接的任何人都有权这样做。这通常是微不足道的(umask 022
意味着将是这种情况)。
chown -h
MacOS X 上的底层系统调用是setattrlist(2)
.
http://en.wikipedia.org/wiki/Symbolic_link
符号链接的文件系统权限通常只与链接本身的重命名或删除操作相关,与目标文件自身权限控制的目标文件的访问方式无关。
链接的权限就是这样。它指向的仍然有它自己的权限。