Contents

权限如何应用于链接

1. 概述

在本文中,我们将了解权限如何应用于链接。

我们先来复习一下链接的相关权限。然后我们将看到chmodchown 如何对它们进行操作。

2. 权限与链接有何关系?

要了解相关的链接权限,我们可以先看看它们的访问权限和所有权。

让我们首先创建一个指向桌面上文件的链接。我们可以使用su 以 user1 的身份执行命令ln ,这将确保他们拥有创建的链接的所有权。

$ su user1 -c 'ln -s "/home/user1/Desktop/subdir/file.txt" "/home/user1/links/user1_symlink"'

然后让我们使用stat 打印我们刚刚创建的链接的权限和所有权。

$ stat -c "%n | %A | %G:%U" '/home/user1/links/user1_symlink'
/home/user1/links/user1_symlink | lrwxrwxrwx | user1:user1

**符号符号lrwxrwxrwx是链接可以拥有的唯一访问权限集。**此外,这些权限仅具有代表性,因为它们从未用于任何操作。

相反,由父目录决定用户如何与链接交互。

让我们看看我们是否可以使用readlink 命令访问这个链接。

$ su user2 -c 'readlink -v "/home/user1/links/user1_symlink"'
readlink: /home/user1/links/user1_symlink: Permission denied

我们没有访问链接的正确权限,所以让我们尝试为其路径中的目录添加执行权限。然后我们可以使用fc 重新执行我们之前的命令 ,看看是否得到不同的结果。

$ chmod +x "/home/user1/links/" "/home/user1/"; fc -s -1
...
/home/user1/Desktop/subdir/file.txt

用户必须有权访问链接的父目录才能访问链接本身。

如果我们希望readlink跟随一个链接而不是仅仅访问它,我们可以使用*-f*标志。

$ su user2 -c 'readlink -v -f "/home/user1/links/user1_symlink"'
readlink: /home/user1/links/user1_symlink: Permission denied
$ chmod +x "/home/user1/Desktop" "/home/user1/Desktop/subdir/"; fc -s -1
...
/home/user1/Desktop/subdir/file.txt

遵循链接要求我们能够访问目标文件的父目录。如果我们想实际操作链接指向的文件,我们还需要对该文件具有正确的权限。

2.1. 粘性目录中的链接

如果任何用户都拥有其父目录的执行和写入权限,则任何用户都可以删除链接,但有一个例外。当链接位于粘性目录 中时,只有其所有者可以删除它。这是粘性目录中任何文件的默认行为。 粘性目录中的链接也有一个独特的规则,它是世界可写的。

$ su user1 -c 'ln -s "/home/user1/Desktop/subdir" "/tmp/user1_tmp_symlink"'
$ su user2 -c 'cd "/tmp/user1_tmp_symlink"'
bash: line 1: cd: /tmp/user1_tmp_symlink: Permission denied
$ su user2 -c 'cd "/home/user1/Desktop/subdir" && echo "${PWD}"'
/home/user1/Desktop/subdir

在这里,我们有一个具有访问目标文件和链接的正确权限的用户。但是,当尝试取消引用链接时,它们会被拒绝。

发生这种情况是因为只有链接的所有者可以跟随世界可写粘性目录中的链接。

3. chmodchown如何对链接应用权限

用于应用权限的两个重要命令是chmodchown。在本节中,我们将讨论它们如何应用于链接。

让我们首先在指向Desktop目录的链接上运行这些命令。

$ su user1 -c 'ln -s "/home/user1/Desktop/" "/home/user1/links/user1_symlink2"'
$ chmod 740 '/home/user1/links/user1_symlink2'; chown user2:user2 "$_"
$ stat -c "%n - %a - %U:%G" '/home/user1/Desktop/' 
"/home/user1/Desktop/" - 740 - user2:user2

**将遵循从命令行传递给chmodchown的链接。**这将导致只修改目标文件,而不是链接。

我们还可以使用 chown修改链接的所有权。

$ chown -h user2:user2 '/home/user1/links/user1_symlink2'
$ stat -c "%n %U:%G" "$_"
/home/user1/links/user1_symlink2 - user2:user2

** -h标志在与chown一起使用时防止任何链接被跟踪**。chmod没有等效标志,因为无法在链接上编辑访问权限。

如果我们想通过chmodchown 使用递归,我们可以使用*-R*标志。

$ chmod -R 740 '/home/user1/links'; chown -R user2:user2 "$_"
$ stat -c "%n - %a - %U:%G" '/home/user1/Desktop/subdir/file.txt'
/home/user1/Desktop/subdir/file.txt - 700 - user1:user1
$ chmod 740 -R '/home/user1/links'{/,/*}; chown user1:user1 -R "$_"; fc -s -1
...
/home/user1/Desktop/subdir/file.txt - 740 - user1:user1

正如我们所见,chmod不会遍历使用递归找到的链接,除非它们通过命令行显式传递。这适用于手动传递特定文件,但也适用于 Bash 文件名扩展。

另一方面,chown在递归期间不会遍历任何链接,即使在命令行上作为参数传递也是如此。相反,如果我们希望chown在递归期间遍历链接,我们可以使用*-H*标志。

$ chown -R -H user2:user2 '/home/user1/links/'*
$ stat -c "%n - %U:%G" '/home/user1/Desktop/subdir/file.txt'
/home/user1/Desktop/subdir/file.txt - user2:user2

-Hchown*链接一起使用时,将遍历命令行上传递的链接。*

此标志只是使用chown应用权限时与*-R*一起使用的三个标志之一。

第二个标志是*-L标志,它导致在递归期间遍历所有链接。最后,-P标志是使用-R*时的默认行为,并防止在递归期间取消引用任何链接。