Answers:
这取决于您的呼叫方式chmod
和运行平台。
例如,在Linux系统上,这样man chmod
说:
chmod
从不更改符号链接的权限;该chmod
系统调用不能改变他们的权限。这是没有问题的,因为从不使用符号链接的权限。但是,对于命令行上列出的每个符号链接,请chmod
更改指向文件的权限。相反,chmod
忽略在递归目录遍历期间遇到的符号链接。
但是,在Mac上,可以使用chmod使用以下选项(来自man chmod
)来修改符号链接的权限:
-h如果文件是符号链接,请更改链接本身而不是链接指向的文件的模式。
为了举例,让我们假设您在此答案的其余部分都在Linux计算机上。
如果在第一种情况下,您chmod -R 777 directory
要递归地更改权限,则链接目标将不会受到影响,但是如果这样做chmod 777 directory/*
,链接目标将受到影响。
如果直接在链接目标上更改权限,这些权限将保留下来(因为正如手册页和baraboom所说,实际的链接权限未用于任何操作)。
测试日志说明:
$ mkdir dir && touch dir/file{1,2} /tmp/file3 && ln -s {/tmp,dir}/file3
$ ls -l dir/* /tmp/file3
-rw-r--r-- 1 user group 0 2011-06-27 22:02 /tmp/file3
-rw-r--r-- 1 user group 0 2011-06-27 22:02 dir/file1
-rw-r--r-- 1 user group 0 2011-06-27 22:02 dir/file2
lrwxrwxrwx 1 user group 10 2011-06-27 22:02 dir/file3 -> /tmp/file3
$ chmod -R 777 dir && ls -l dir/* /tmp/file3
-rw-r--r-- 1 user group 0 2011-06-27 22:02 /tmp/file3
-rwxrwxrwx 1 user group 0 2011-06-27 22:02 dir/file1
-rwxrwxrwx 1 user group 0 2011-06-27 22:02 dir/file2
lrwxrwxrwx 1 user group 10 2011-06-27 22:02 dir/file3 -> /tmp/file3
$ chmod 700 dir/* && ls -l dir/* /tmp/file3
-rwx------ 1 user group 0 2011-06-27 22:02 /tmp/file3
-rwx------ 1 user group 0 2011-06-27 22:02 dir/file1
-rwx------ 1 user group 0 2011-06-27 22:02 dir/file2
lrwxrwxrwx 1 user group 10 2011-06-27 22:02 dir/file3 -> /tmp/file3
baraboom和peth的答案都是正确的:符号链接本身的权限位不相关(在macOS上除外;请参见下文),并且更改符号链接的权限(通过chmod
命令行工具或chmod()
系统调用)将仅充当如果它是针对符号链接的目标执行的。
引用SUSv4 / POSIX.1-2008 symlink()系统调用的描述:
未指定创建的符号链接的文件模式位的值。POSIX.1-2008指定的所有接口的行为都应像始终可以读取符号链接的内容一样,只是未指定stat结构的st_mode字段中返回的文件模式位的值。
在这里,“未指定”为每个实现留有解释的余地。细节:
stat()
将返回st_mode=0777
;ls -l
因此始终显示lrwxrwxrwx
符号链接。chmod -h
上面提到的命令可以更改此链接权限(内部使用非POSIX lchown()
系统调用来实现此目的),并且stat()
系统呼叫会传回的这个值st_mode
。根据POSIX的规定,始终可以遵循Linux和FreeBSD上的符号链接。特别是在FreeBSD上,这意味着符号链接的文件模式对访问控制完全没有影响。
另一方面,macOS稍微破坏了POSIX。尽管无论其读取权限如何都可以遵循符号链接,但是如果用户没有读取权限,则readlink()
失败并显示EACCES
(权限被拒绝):
$ sudo ln -shf target symlink
$ sudo chmod -h 444 symlink
$ ls -l symlink
lr--r--r-- 1 root staff 1 Mar 14 13:05 symlink -> target
$ sudo chmod -h 000 symlink
$ ls -l symlink
ls: symlink: Permission denied
l--------- 1 root staff 1 Mar 14 13:05 symlink
$ echo kthxbye > target
$ cat symlink
kthxbye
(请注意,-> target
第二个ls -l
命令的输出中缺少该部分,即使用户没有对的读取权限,该部分cat symlink
仍然成功并打印了target
文件的内容symlink
。)
NetBSD显然提供了一个名为的特殊安装选项symperm
,如果设置了该选项,它将导致符号链接读取/执行许可权来控制readlink()
和遍历链接。