当我们设置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 和所有者的所有权限以及拥有组的读取权限”。