文件可访问性

每个文件都以一种访问方式创建。 每种访问方式都授予用户、用户组和所有其他用户读、写或执行许可权。

新创建文件的访问位是 umask 位取反后与创建进程所设置的文件创建方式位进行“与”操作的结果。 进程创建新文件时,操作系统执行下列操作:
  • 确定创建进程的许可权
  • 检索合适的 umask
  • 反转 umask
  • 使用“与”操作将创建进程的许可权与 umask 值的取反组合
例如,如果现有文件设置了 027 许可权位,那么用户不被允许任何许可权。 写许可权被授予组。 为所有其他用户设置读、写和执行访问权。 027 许可权方式的 umask 值将是 750(源许可权的取反)。 当 750 与 666(由创建文件的系统调用设置的文件创建方式位)进行“与”操作时,文件的实际许可权为 640。 此实例的另一种表示是:
027 = _ _ _  _ W _  R W X        Existing file access mode
750 = R W X  R _ X  _ _ _        Reverse (umask) of original
                                 permissions
666 = R W _  R W _  R W _        File creation access mode
ANDED TO
750 = R W X  R _ X  _ _ _        The umask value
640 = R W _  R _ _  _ _ _        Resulting file access mode
子例程 描述
access 子例程 调查和报告 Pathname 参数中所命名文件的可访问性方式。 此子例程使用实用户标识和实组标识,而不是有效用户和组标识。 使用实用户标识和实组标识允许具有 set-user-ID 和 set-group-ID 访问方式的程序限制只能由具有正确权限的用户进行访问。
chmodfchmod 子例程 更改文件访问许可权。
chown 子例程 复位文件索引节点的所有权字段并清除前一个所有者。 新的信息被写到索引节点,进程结束。 chmod 子例程以类似的方式工作,但许可权方式标志被更改而不是文件所有权。
umask 设置和获取文件创建掩码的值。
在以下示例中,用户无权访问该文件secrets. 但是,当程序special运行,程序的访问模式为set-uIDroot,程序可以访问文件。 程序必须使用 access 子例程防止破坏系统安全性。
$ ls -l
total 0
-r-s--x--x      1 root  system   8290 Jun 09 17:07 special
-rw-------      1 root  system   1833 Jun 09 17:07 secrets
$ cat secrets
cat: cannot open secrets

任何 set-uID 或 set-gID 程序都必须使用 access 子例程来防止这种类型的侵入。 更改文件所有权和访问方式的操作影响索引节点,而不影响文件中的数据。 要进行这些更改,进程的所有者必须具有 root 用户权限或拥有文件。