鉴于,
touch /tmp/abc
ln -vs abc /tmp/def
$ ls -l /tmp/???
-rw-rw-r-- 1 ubuntu ubuntu 0 Apr 10 22:10 /tmp/abc
lrwxrwxrwx 1 ubuntu ubuntu 3 Apr 10 22:10 /tmp/def -> abc
为什么我得到:
$ sudo chown syslog: /tmp/def
chown: cannot dereference '/tmp/def': Permission denied
$ sudo chown --dereference syslog: /tmp/def
chown: cannot dereference '/tmp/def': Permission denied
参考:
chown(1):
--dereference
影响每个符号链接的引用(这是默认值),而不是符号链接本身
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 20.04.6 LTS
Release: 20.04
Codename: focal
这个答案假设这是适当的:
root 用户(以下安全功能特别旨在影响)与任何其他用户一样,受到 sysctl
fs.protected_symlinks
中描述的影响proc(5)
:这里:
/tmp
是一个粘性的世界可写目录:失败/tmp
def 的所有者 (ubuntu) 与的所有者 (root)不同:失败因此
EACCESS
=权限被拒绝这里还有另外两种可行的情况:
防止第一个条件失败
现在符号链接由 root 拥有,第一个条件不会失败,允许运行:
才能成功影响
/tmp/abc
.如果有这样的意图,
def
可以改回其以前的所有者或也可以syslog
:或者
防止第二个条件失败
在非粘性目录中进行相同的实验(即使它是全局可写的):
现在允许运行:
如果有这样的意图,它们可以被移回:
此外,正如comment 中所建议的,通过从原始用户进行查找,可以再次防止第一个条件失败
ubuntu
,因为它已经是符号链接的所有者。例如使用:\n
或者如果目标文件名末尾没有特殊字符,例如换行符 (LF / )(这将被 shell 解释器删除),就像 OP 的情况一样,只需: