为什么 Linux/POSIX 有 lchown 而没有 lchmod?

为什么 Linux/POSIX 有 lchown 而没有 lchmod?

看来Linux支持更改符号链接的所有者(即lchown)但是改变符号链接的模式/权限(即lchmod)是不支持。据我所知,这是符合 POSIX 的。然而,我不明白为什么人们会支持其中一种操作而不是同时支持两种操作。这背后的动机是什么?

答案1

Linux 与大多数类 Unix 系统一样(Apple OS/X 是少数例外之一),在解析目标时会忽略符号链接的权限。

然而,与其他文件一样,符号链接的所有权与在设置了该位的目录(t例如/tmp.

为了能够删除或重命名 中的文件(无论是否有符号链接)/tmp,您需要是该文件的所有者。这是人们可能想要更改符号链接的所有权(以授予或删除取消链接/重命名它的权限)的原因之一。

$ ln -s / /tmp/x
$ rm /tmp/x
# OK removed

$ ln -s / /tmp/x
$ sudo chown -h nobody /tmp/x
$ rm /tmp/x
rm: cannot remove ‘/tmp/x’: Operation not permitted

另外,正如马克·普洛特尼克在他的书中提到的现在已删除答案、备份和归档应用程序需要lchown()将符号链接恢复到其原始所有者。另一种选择是在创建符号链接之前切换 euid 和egid,但这不会有效且会使符号链接提取到的目录的权限管理变得复杂。

答案2

posix 中没有 lchmod(),但有 fchmodat() 可以允许设置符号链接的权限。这仍然不需要评估符号链接的权限。

相关内容