我相信(不确定)文件/目录的所有者和根用户是唯一允许更改文件/目录权限的用户。我是否正确,或者是否还有其他用户也可以更改权限?
答案1
只有所有者和root
(超级用户)才被允许更改文件或目录的权限。这意味着所有者和超级用户可以设置读( r
)、写( w
) 和执行( x
) 权限。但chown
仅允许使用该命令更改文件和目录的用户所有权root
。如果用户是新组的成员,则chgrp
允许更改组所有权和文件的所有者。root
答案2
为了正常操作,只有 root 和所有者可以chmod
。此外,root 可以chown
和chgrp
,此外,chgrp
只要所有者是目标组的成员,所有者就可以。
出于安全考虑,还有另一种情况:任何对包含该文件的目录具有写权限的用户都可以用副本替换该文件,从而成为所有者,获得修改权限和内容的能力。
就像这样:
14:14 mybox:~ mkdir mydir
14:14 mybox:~ cd mydir/
14:14 mybox:mydir echo foo | sudo tee yourfile
foo
14:14 mybox:mydir ls -ld . yourfile
drwxr-xr-x 3 me staff 102 Apr 11 14:14 .
-rw-r--r-- 1 root staff 4 Apr 11 14:14 yourfile
我们创建了一个目录,并以 root 身份写入了一个文件。由于 root 拥有该文件,因此我们无法写入它,也无法 chmod:
14:15 mybox:mydir echo bar > yourfile
-bash: yourfile: Permission denied
14:15 mybox:mydir chmod a+x yourfile
chmod: Unable to change file mode on yourfile: Operation not permitted
但是,我们确实对该目录具有写权限,因此我们可以替换该文件以获得所有权:
14:15 mybox:mydir mv yourfile yourfile2
14:15 mybox:mydir cp yourfile2 yourfile
14:15 mybox:mydir ls -ld . yourfile
drwxr-xr-x 4 me staff 136 Apr 11 14:15 .
-rw-r--r-- 1 me staff 4 Apr 11 14:15 yourfile
现在我们是所有者,我们当然可以对该文件执行我们想要的操作:
14:15 mybox:mydir echo bar > yourfile
14:15 mybox:mydir chmod a+x yourfile
14:16 mybox:mydir cat yourfile
bar
同样,任何具有写入权限的用户任何指向该文件的完整路径中的目录可以替换该点之后的目录结构,从而获得具有给定名称的文件的所有权。当然,实际原始文件(我们将其重命名为“yourfile2”)的所有权或权限不会更改。
14:17 mybox:mydir ls -l yourfile2
-rw-r--r-- 1 root staff 4 Apr 11 14:14 yourfile2
答案3
该chmod
命令相当直接地调用同名的系统调用;系统调用的手册页chmod(2)
(在 Linux 4.10 上)显示:
调用进程的有效UID必须与文件的所有者匹配,或者该进程必须具有特权(Linux:它必须具有该
CAP_FOWNER
能力)。如果调用进程没有特权(Linux:不具备该
CAP_FSETID
能力),并且文件的组与进程的有效组ID或其补充组ID之一不匹配,则该S_ISGID
位将被关闭,但是这不会导致返回错误。
所以,是的,以 root 身份运行的进程可以更改任何文件的权限(如果它没有放弃该CAP_FOWNER
功能)。
同样令人感兴趣的是chown
;手册页chown(2)
说:
只有特权进程(Linux:具有该
CAP_CHOWN
能力的进程)才能更改文件的所有者。文件的所有者可以将文件的组更改为该所有者所属的任何组。特权进程(Linux:withCAP_CHOWN
)可以任意更改组。