使用 setuid 和八进制 4000 的文件权限

使用 setuid 和八进制 4000 的文件权限

当我们设置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 [~]#

相关内容