Answers:
为了正常运行,只有root和owner可以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
getfacl / setfacl
),它比“经典”样式文件权限具有更大的灵活性。* nix中的文件删除通过从目录中删除到文件的链接来进行,因此文件的删除始终由目录权限控制;文件权限本身在那里不起作用。
该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
)可以任意更改组。