什么情况下会chmod
失败?
我查看了手册页,但它只指定了用法,并没有详细说明它在什么情况下不起作用。
我认为chmod
如果满足以下条件就会起作用:
- 你是root
- 您拥有目标文件(并且正在设置普通模式位,即不是粘性位,其他)
用户可以用来chmod
更改他们具有组访问权限的文件的权限吗?与读/写访问权限有关吗?
答案1
只有文件的所有者或 root 用户可以更改文件的权限。文件或其父目录的当前权限是无关的。这在中指定POSIX:
应用程序应确保进程的有效用户 ID 与文件的所有者匹配,或者进程具有适当的权限才能执行此操作。
在大多数 unice 上,“适当的权限”意味着以 root 身份运行。如果不满足这些条件,chmod
通常会失败并显示EPERM
,但允许其他行为(例如由于安全违规而中止程序)。
此外,某些 Unix 变体具有系统特定的授权或禁止方式chmod
。例如,Linux 有一个能力( CAP_FOWNER
) 允许进程更改文件的权限和其他元数据,而不管其所有者如何。
chmod
即使文件存在、可访问并且具有适当的所有者,也可能因其他原因而失败。常见的包括只读文件系统或不支持FAT等权限的文件系统。不太常见的限制包括特定于系统的限制,例如不可变属性Linux 的 ext2 文件系统及其后继者。
1除非运行的进程chmod
必须能够访问该文件,因此它必须对包含该文件的目录以及它为此遍历的任何其他目录具有执行权限。
答案2
您需要的详细信息位于 chmod() 系统调用的手册页中。而不是man chmod
使用man 2 chmod
. man chattr
并且man 2 setxattr
你也会感兴趣; chattr/setxattr() 设置的文件属性增强了 chmod 设置的传统 Unix 权限的行为。
答案3
用户可以使用 chmod 更改他们具有组访问权限的文件的权限吗?
为什么你不尝试看看呢?
$ touch foo
$ sudo install -o root -g $(id -gn) -m660 foo bar
$ ls -la bar
-rw-rw---- 1 root staff 0 Oct 21 21:33 bar
$ chmod g-w bar
chmod: bar: Operation not permitted
$ chmod g+x bar
chmod: bar: Operation not permitted
答案4
根据 UNIX 标准,“进程的有效用户 ID 必须与文件的所有者匹配,或者进程必须具有适当的权限才能执行此操作。”
关于适当特权的部分需要一些解释。在传统系统上,当进程的有效 UID(在 Linux 上是文件系统 UID,但见下文)为 0 [即 root] 时,允许对所有文件进行 chmod。
Linux有一个系统叫能力,该位控制对所有文件CAP_FOWNER
使用的能力。chmod
默认情况下,当execve()
调用创建根进程时(通过执行 setuid 二进制文件或当实际 UID 为 0 时)或当有效 UID 设置为 0 时(并在设置为非零值时删除),将授予所有功能,以及一组功能,包括CAP_FOWNER
在文件系统 UID 设置为 0 时启用(并在设置为非零值时禁用)。请阅读联机帮助页以获取更多详细信息。
您提到了粘性位,但忽略了这样一个事实:当用户不在分配给文件的组中时,他们也不能在文件上设置 setgid 位。在其他实现定义的情况下,setuid 或 setgid 位也可能被忽略。