文件权限如何应用于符号链接?


93

假设您具有以下结构:

+ directory
-- file1
-- file2
-- file3 -> /tmp/file3

file3是到file3系统其他位置的链接。

现在让我们说chmod 777一下目录及其中的所有内容。请问我file3/tmp收到这些权限?另外,假设我们有相同的情况,但是相反。

/tmp/file3 -> /directory/file3

如果我对链接到的文件应用权限,这对链接有何影响?


权限仅影响文件,而不影响符号链接。
baraboom 2011年

Answers:


90

这取决于您的呼叫方式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

2
我也感到惊讶。下一个问题:符号链接的权限谁的?
爱德华·福克

@EdwardFalk符号链接权限不是非限制性的,因为所有内容都必须能够遍历它才能从链接文件中获取权限。
Walf

5

baraboom和peth的答案都是正确的:符号链接本身的权限位不相关(在macOS上除外;请参见下文),并且更改符号链接的权限(通过chmod命令行工具或chmod()系统调用)将仅充当如果它是针对符号链接的目标执行的。

引用SUSv4 / POSIX.1-2008 symlink()系统调用的描述

未指定创建的符号链接的文件模式位的值。POSIX.1-2008指定的所有接口的行为都应像始终可以读取符号链接的内容一样,只是未指定stat结构的st_mode字段中返回的文件模式位的值。

在这里,“未指定”为每个实现留有解释的余地​​。细节:

  • 在Linux上(使用ext4fs测试),无论创建符号链接时的umask是什么,都stat()将返回st_mode=0777ls -l因此始终显示lrwxrwxrwx符号链接。
  • 在macOS(HFS)和FreeBSD(UFS和ZFS两者)上,符号链接确实具有其自己的权限: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()和遍历链接。


-1
  1. 删除链接文件(确保没有任何进程使用它之后)
  2. 设置umask的方式应使777-umask =必需的文件权限
  3. 重新创建链接文件

3
这如何回答这个问题?
jww
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.