setuid 和八进制 4000 的文件权限

DUK*_*UKE 7 setuid chmod

当我们设置setuid为文件时,我们在终端中执行以下操作:

chmod u+s filename
Run Code Online (Sandbox Code Playgroud)

这工作正常。但是八进制数 4000 总是与 setuid 相关联(在书籍等中)。

我了解(在一定程度上)文件权限、umask、setuid 的概念以及使用八进制数和chmod. 但是我仍然无法弄清楚八进制数4000和setuid之间的关系。请解释。

lge*_*get 10

这只是一个约定。所有常量标识符都与 Linux 源代码中的数字相关联。其中一些非常旧,来自内核的第一个版本,而其他一些是最近添加的。

S_ISUID与“setuid”相关的常量在include/uapi/linux/stat.h 中定义,这是众多 Linux 头文件之一。它可以被定义为任何东西,但它恰好是 04000。

正如@steeldriver 所述,man 2 stat可以帮助您理解用于文件权限的不同常量的含义:

       S_IFMT     0170000   bit mask for the file type bit fields
       S_IFSOCK   0140000   socket
       S_IFLNK    0120000   symbolic link
       S_IFREG    0100000   regular file
       S_IFBLK    0060000   block device
       S_IFDIR    0040000   directory
       S_IFCHR    0020000   character device
       S_IFIFO    0010000   FIFO
       S_ISUID    0004000   set-user-ID bit
       S_ISGID    0002000   set-group-ID bit (see below)
       S_ISVTX    0001000   sticky bit (see below)
       S_IRWXU    00700     mask for file owner permissions
       S_IRUSR    00400     owner has read permission
       S_IWUSR    00200     owner has write permission
       S_IXUSR    00100     owner has execute permission
       S_IRWXG    00070     mask for group permissions
       S_IRGRP    00040     group has read permission
       S_IWGRP    00020     group has write permission
       S_IXGRP    00010     group has execute permission
       S_IRWXO    00007     mask for permissions for others (not in group)
       S_IROTH    00004     others have read permission
       S_IWOTH    00002     others have write permission
       S_IXOTH    00001     others have execute permission
Run Code Online (Sandbox Code Playgroud)

在本练习中,您不仅可以看到常量及其数值,还可以看到它们的选择方式。开发人员/设计人员选择了可以它们组合在一起的常量。例如S_ISUID and S_IRWXU and S_IRUSR and S_IRGRP = 04740,so 权限04740精确地表示“setuid 和所有者的所有权限以及拥有组的读取权限”。

  • +1 btw 在大多数系统上,`man 2 stat` 讨论了 `stat` 结构及其字段(特别是 `st_mode` 值) - 比拖网头文件稍微方便一些。 (2认同)