当我们设置setuid
一个文件时,我们在终端中执行以下操作:
chmod u+s filename
这很好用。但八进制数 4000 始终与 setuid 相关联(在书籍等中)。
我(在某种程度上)了解文件权限、umask、setuid 的概念以及在chmod
.但我还是搞不清楚八进制数4000和setuid之间的关系。请解释。
答案1
这只是一个约定。所有常量标识符都与 Linux 源代码中的数字相关联。其中一些非常古老,来自内核的第一个版本,而另一些则是最近添加的。
与“setuid”相关的常量S_ISUID
定义在包括/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
在本例中,您不仅可以看到常量及其数值,还可以看到它们的选择方式。开发人员/设计人员已经选择了常量,您可以结合他们。例如S_ISUID and S_IRWXU and S_IRUSR and S_IRGRP = 04740
,权限04740
精确地表示“setuid 和所有者的所有权限以及所属组的读取权限”。
答案2
在大多数类 Unix 系统中,文件、目录或任何其他文件系统对象都由索引节点,其中包含一个称为模式,它描述了对象的类型及其一些权限。它的描述在POSIX stat.h。
The following symbolic names for the values of type mode_t shall also be defined:
File type:
S_IFREG
Regular.
S_IFDIR
Directory.
S_IFLNK
Symbolic link.
File mode bits:
S_IRWXU
Read, write, execute/search by owner.
S_IRUSR
Read permission, owner.
S_IWUSR
Write permission, owner.
S_IXUSR
Execute/search permission, owner.
...
S_ISUID
Set-user-ID on execution.
S_ISGID
Set-group-ID on execution.
...
这些都是整数常量的符号名称。S_IFREG
是 0100000。S_IRUSR
是 000400。S_ISUID
是 004000。它们采用八进制以便于使用:文件模式位在逻辑上可以被视为 4 组,每组 3 位。
在这里您可以看到 my 的文件类型位和文件模式位.profile
:
$ perl -e 'printf("%#o\n", (stat(".profile"))[2]);'
0100644
用户可以使用系统chmod
调用(采用整数参数(可能使用其中一些 S_* 符号常量))或实用chmod
程序(采用整数或符号名称(例如u+r
)。
由于在实践中,模式位的不同组合并不多,因此几十年来许多 Unix 用户都使用chmod
数字参数而不是符号名称进行调用(系统调用和命令)。0755
意思是“所有者可写,其他人可读和可执行”,0644
意思是“所有者可写,其他人可读”,04755
意思是“setuid,所有者可写,其他人可读和可执行”。
答案3
来自 (debian jessy) 的(英文)手册页chmod
:(由我突出显示)
数字模式为 1 到 4 个八进制数字 (0-7),通过将值为 4、2 和 1 的位相加得出。省略的数字假定为前导零。 第一个数字选择设置的用户 ID (4) 和设置的组 ID (2) 以及限制删除或粘性 (1) 属性。 第二个数字选择拥有该文件的用户的权限:读(4)、写(2)和执行(1);第三个选择文件组中其他用户的权限,具有相同的值;第四个用于不在文件组中的其他用户,具有相同的值。
我不确定这是否回答了您的问题,但它确实解释了这些数字的含义。
答案4
你可以通过这个链接有关更多详细信息setuid 设置gid和粘性位。
Setuid、Setgid 和 Sticky Bits 是特殊类型的 Unix/Linux 文件权限集,允许某些用户以提升的权限运行特定程序。最终,对文件设置的权限决定了哪些用户可以读取、写入或执行该文件。为了特殊权限,您在这些数字前面加上另一个数字,其中4是setuid,2是setgid,1是粘性位。下面的命令都是一样的。
root@host [~]# chmod 4755 myfile
root@host [~]# chmod u+s myfile
root@host [~]# ls -l myfile
-rwsr-xr-x 1 test test 0 Mar 2 17:59 myfile
root@host [~]#
root@host [~]# chmod 2755 myfile
root@host [~]# chmod g+s myfile
root@host [~]# ls -l myfile
-rwxr-sr-x 1 test test 0 Mar 2 17:59 myfile
root@host [~]#
root@host [~]# chmod 1755 mydir
root@host [~]# chmod +t mydir
root@host [~]# ls -ld mydir
drwxr-sr-t 2 test test2 4096 Mar 2 19:59 mydir
root@host [~]#