为什么Linux / POSIX具有lchown但没有lchmod?


11

看来,Linux支持更改符号链接(即业主lchown),但改变一个符号链接的模式/许可(即lchmod)是不支持的。据我所知,这与POSIX一致。但是,我不明白为什么一个人会支持这两个操作中的任何一个而不是两者都支持。这背后的动机是什么?


1
符号链接的权限始终为lrwxrwxrwx。一个chmod使得这里没有任何意义。单击链接将带您到目标权限。
ott-- 2015年

2
@ott:在Linux上,正是由于Linux不支持,所以symlink的权限始终是您授予的lchmod。但是其他类似Unix的OS确实支持它(例如Mac OS X),所以问题是为什么Linux在支持时不支持lchown
Florian Brucker 2015年

Answers:


9

例如,与大多数类似Unix的系统(Apple OS / X是罕见的例外之一)一样,Linux在解决其目标时会忽略对符号链接的许可。

但是,与其他文件一样,符号链接的所有权在允许重命名或取消链接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

而且,正如Mark Plotnick在他现在已删除的答案中所提到的,备份和存档应用程序需要lchown()将符号链接恢复到其原始所有者。另一种选择是在创建符号链接之前切换euid和egid,但这将不高效,而且会使提取符号链接的目录上的权限管理复杂化。


我不确定这是否是原始动机,但确实提供了设计有用的理由。谢谢!
弗洛里安·布鲁克

0

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


1
OP知道不lchmod符合POSIX。这个答案还补充了问题中没有的内容?
muru

操作员询问为什么仅支持其中一个功能,我解释说实际上两个功能都可用,只是没有提到名称。
2015年

1
怎么会这样?该标准说有些实现可能允许更改符号链接的模式。POSIX规范中的接口不支持此功能。具有这种支持的系统提供了一个名为lchmod()的接口。为了支持此类实现,fchmodat()具有标志参数。这一切都说明fchmodat有一个标志,可让实现更改符号链接权限。并非一定如此。
muru

正确,因为符号链接的权限自35年以来未进行评估,因此更改模式没有任何意义。存在Fchmodat()以确保正交性。唯一真正的优点是futimensat(),因为符号链接的可设置时间戳帮助人们理解目录树。
2015年

@ schilly,OS / X确实尊重符号链接的权限。在这里,如果您没有读取权限,则无法解决其目标。
斯特凡Chazelas
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.