例如,我拥有770权限的foo.sh.当我做:
ln -s foo.sh bar.sh
Run Code Online (Sandbox Code Playgroud)
链接bar.sh拥有2777权限.为什么是这样?我以为他们本来是为了继承?
Jon*_*ler 25
符号链接上的权限在很大程度上是无关紧要的.它们通常是由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(RHEL 5 for x86_64;内核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
$
Run Code Online (Sandbox Code Playgroud)
我在子shell中运行它,因此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
$
Run Code Online (Sandbox Code Playgroud)
请注意,这与链接的命令序列(给出或接受文件名)相同.
在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 -hMacOS X上的底层系统调用是setattrlist(2).