S_ISUID  (04000)  set-user-ID (set process effective user ID on execve(2))
S_ISGID  (02000)  set-group-ID  (set  process effective group ID on execve(2); mandatory locking, as described in fcntl(2);

        take a new file's group from parent directory, as described in chown(2) and mkdir(2))
S_ISVTX  (01000)  sticky bit (restricted deletion flag, as described in unlink(2))

转自:linux中文件的模式和权限

Linux的文件,有个16位的字来表示文件的类型和属性信息,其中4位表示文件的类型信息,剩下的12位表示文件的模式。
在传统的unix和linux文件系统模型中,每个文件都有一个9个权限位用来控制谁能够读写和执行该文件内容,还有一个3个权限位来影响可执行程序运行,这12个位就共同构成了该文件的“模式”(mode)。

权限位

9个权限位就分别被分成3组,每组有3位。最前面的一组3位控制属主的访问权限,第二个三位组控制组的访问权限,最后的三位组控制其他每个人访问权限。在每个3位组中,高位是读取位,中间位是写入位,低位是执行位。

在普通文件上,读取位允许打开文件并读取它的内容。写入位允许修改和删截该文件的内容。不过,能否删除和重命名(或者删除后再建)该文件则由该文件的父目录上的权限设置所控制,因为名字到数据空间的映射关系实际上存储在父目录中。执行位表示该文件是否是可执行的。

对于目录来说,其实也是文件文件,只是有点不同。当分析路径名时,执行位(在这种上下文环境中,也经常叫做“搜索(search)”位或者叫做“扫描(scan)”位)的作用是控制是否能够进入或者通过该目录,读取位和执行位的组合作用才是控制是否列出目录的内容,写入位和执行位的组合作用则表示是否允许在目录中创建、删除和重命名文件。

setuid和setgid位

3个特殊权限位是控制进程运行时的表现的,这3位中高位是setuid位,中间位是setgid位,低位是sticky位(粘附位)。在继续探讨这3个位之前,我们先来简单介绍一些辅助信息。

linux的进程至少有7个与之相关的标识:一个真实 UID(real UID)、一个有效UID(effective UID)和一个保存UID(saved UID);一个真实GID(read GID)、一个有效GID(effective GID)和一个保存GID(saved GID);还有一个文件系统UID(filesystem UID)。

简单的说,read UID/GID就是进程创建者的UID/GID。EUID(effective UID)/EGID用来确定进程在任何给定的时刻对哪些资源或者文件具有访问权限,即进程在运行时其当前的“虚拟身份”,也就是说在进程运行时候其UID 和GID可能不是创建它的用户的UID和GID,但是在一般情况下,UID/GID和EUID/EGID是一样的。SUID(saved UID)/SGID(saved GID)表示进程刚刚开始执行时刻,进程EUID/EGID的副本。而FSUID(filesystem UID),它只用来对文件系统权限的判断,但在内核之外并不常用。

尽管通常对于一个进程来说不大可能会改变它自己的归属关系状态(即默认情况UID/GID=EUID/EGID),但在一种特殊情况下,可以修改进程的EUID和EGID。当 执行设置了setuid和setgid的权限位的命令时,则当该命令运行时,其EUID/EGID为该程序命令的映像文件的UID或者GID,而不是启动运行该命令的用户UID/GID。一个例子就是passwd命令,其程序命令的映像文件的UID/GID都是root,但是当一个普通用户运行这个命令时 (因为passwd可执行文件设置了其他人的执行权限),则这个用户开启的passwd命令进程的EUID/EGID=root而非该普通用户。

既然setuid和setgid设置后的进程的EUID/EGID不是进程启动者的UID/GID,而是进程映像文件所有者的UID/GID,故该程序所产生的任何操作的“身份”都是这个“虚拟身份”,即EUID/EGID。

举个例子touch

默认情况:

~$ls /bin/touch -al
-rwxr-xr-x root root Jan /bin/touch
~$touch wang
~$ls -al wang
-rw-rw-r-- yuxi yuxi Jul : wang

setuid

~$sudo chmod u+s /bin/touch
[sudo] password for yuxi:
~$ls -al /bin/touch
-rwsr-xr-x root root Jan /bin/touch
~$rm wang
~$touch wang
~$ls -al wang
-rw-rw-r-- root yuxi Jul : wang

setuid+setgid

~$sudo chmod g+s /bin/touch
~$rm wang
~$touch wang
~$ls -al wang
-rw-rw-r-- root root Jul : wang

简单的总结一下,就是setuid和setgid是让程序执行的时候“临时的”的拥有了程序文件所有者的uid和gid,等程序执行完后再恢复到发起者的权限。
对于目录,如果在某个目录上设置了setgid位以后,在这个目录中创建的文件具有该目录的属组权限而不是创建该文件的用户的默认属组。至于对目录设置setuid,是不起任何作用的。

~$mkdir a b c
~$chmod u+s a
~$chmod g+s b
~$chmod +s c
~$ls -al
total
drwxrwxr-x yuxi yuxi Jul : .
drwxrwxrwt root root Jul : ..
drwsrwxr-x yuxi yuxi Jul : a
drwxrwsr-x yuxi yuxi Jul : b
drwsrwsr-x yuxi yuxi Jul : c
-rw-rw-r-- root root Jul : wang
~$touch a/u
~$touch b/u
~$touch c/u
~$ls -l a b c
a:
total
-rw-rw-r-- root root Jul : u b:
total
-rw-rw-r-- root yuxi Jul : u c:
total
-rw-rw-r-- root yuxi Jul : u

sticky bit

mode中特殊权限位的低位就是sticky位,称为“粘附位”。在早期的unix系统上,它作为限定符对于可执行文件来说很重要。不过,粘附位的含义现在已经过时了,现在操作系统已经悄然地忽略了它。
如果在目录上设置了这个粘贴位,那么除非您是该目录的属主、该文件的属主或者是超级用户,否则文件系统不会允许删除或者重新命令该目录中的文件。

mode的八进制表示法

mode的12位根据上面的探讨,都是每三位分成一个组合,那么刚好可以使用4个八进制来表示这12位数字。
   
先不看特殊权限位,在9个用户访问权限位上,前面3位代表控制属主的访问权限,读、写、执行权限对应的八进制分别为400、200、100;第二个3位控
制组的访问权限,读、写、执行权限对应的八进制分别为40、20、10;第三个3位控制其他每个人的访问权限,读、写、执行权限对应的八进制分别为4、
2、1。
    再看特殊权限位中的3位,由于setuid、setgid、sticky分别是高、中、低3位,那么其对应的八进制表示就是4000、2000、1000。
   
通过上面的介绍,举例来解释下。文件如果设置了4721权限,表示设置了setuid位,同时文件属主拥有读写执行权限,文件的属组成员拥有写权限,其他
人拥有执行权限。7542则表示设置了setuid、setgid、sticky位,同时文件属主拥有读和执行权限,文件属组成员拥有读权限,其他人拥有
写权限。

mode的助记表示法

更改文件的权限,使用chmod命令,查看用户权限可以使用ls -l命令,这2中命令都接受助记表示法。
    助记表示法,简单的说就是,用 u 代表文件属主(user),用 g 代表属组(group),用字母 o
代表其他人(other),用a代表所有人(all)。用 r 代表读权限(read),用 w 代表写权限(write),用 x
代表执行权限(execute)。用加号 + 表示给文件增加权限,用减号 - 表示给文件减少权限,用等号 =
表示给文件直接赋予某些权限。如下面这些例子:
u+w        为文件的属主添加写入权限
ug=rw,o=r 赋予属主和属组读取写入权限,赋予其他人读取权限
a-x        删除全部3种类别用户的执行权限
g=u        让属组的权限跟属主的权限完全一样。
    剩下3个特殊权限该怎么表示呢?
    用s表示setuid和setgid位,用t表示sticky位。当给属主增加s权限的时候(即
u+s),就表示设置了setuid位,在展现时属主组的x权限会被s权限代替。当给属组增加s权限的时候(即
g+s),就表示设置了setgid位,在展现的时候属组组的x权限会被s权限代替。当增加t权限的时候(即 +t 或者
o+t),即设置了sticky位,在展现的时候其他人组的x权限会被t权限代替。

如果设置了setuid、setgid或sticky中的一个,但是又没有设置相应的执行权限,那么这些位显示为S或T。

在linux系统中,系统自动跟踪文件的修改时间戳、链接数目(可使用ls -i命令查看)和文件大小信息的变化。但是,文件的权限位、归属关系和属组权只有当它们分别采用chmod、chown、chgrp命令修改时才会改变。

umask:分配默认的权限

用户可以使用内建的shell命令umask来影响分配给新创建文件的默认权限。umask用一个三位数字八进制形式来指定,这个值代表要“剥夺”的权限。当创建文件的时候,它的权限就设置为创建程序请求的任何权限去掉umask禁止的权限。

额外的标志

Linux的ext2和ext3文件系统定义了一些补充属性,您可以打开它们来请求获得特殊的文件系统语义。但是这些标志不能用于ext*系列以外的其他文件系统,所以linux使用了特殊命令lsattr和chattr来查看或者改变它们。

文件模式设置用户ID/设置组ID/sticky bit_转的更多相关文章

  1. 获取和设置用户id以及组id

    #include<unistd.h> uid_t getuid(void); uid_t geteuid(void);//获取有效用户id gid_t getgid(void); gid_ ...

  2. 用户id,组id和文件访问权限

    实际用户ID和实际组ID:标示了我们究竟是谁,这两个字段在登录时取自口令文件中的登录项 有效用户ID和有效组ID以及附属组ID:决定了我们的文件的访问权限(通常有效用户ID等于实际用户ID,有效组ID ...

  3. 《UNIX环境高级编程》笔记--更改用户ID和组ID

    在unix系统中,特权是基于用户和组ID的,当程序需要增加特权,或需要访问当前并不允许访问的资源时,我们需要更换自己 用户ID或组ID,使的新ID具有合适的特权或访问权限.与此类似,当程序需要降低其特 ...

  4. 进程控制之更改用户ID和组ID

    在UNIX系统中,特权(例如能改变当前日期的表示法以及访问控制(例如,能否读.写一特定文件))是基于用户ID和组ID的.当程序需要增加特权,或需要访问当前并不允许访问的资源时,我们需要更换自己的用户I ...

  5. 更改用户id 和组id

    转自 http://blog.csdn.net/todd911/article/details/16370577 在unix系统中,特权是基于用户和组ID的,当程序需要增加特权,或需要访问当前并不允许 ...

  6. Linux id 命令 - 显示用户id和组id信息

    要登入一台计算机,我们需要一个用户名.用户名是一个可以被计算机识别的身份.基于此,计算机会对使用这个用户名的登陆的人应用一系列的规则.在Linux系统下,我们可以使用 id 命令. 什么是 id 命令 ...

  7. linux修改用户id,组id

    一.修改用户uid usermod -u foo 二.修改用户gid groupmod -g 2005 foo usermod -g 2005 foo 三.检查 cat /etc/passwd su ...

  8. 文件和目录之设置用户ID和设置组ID

    与一个进程相关联的ID有6个或更多,它们如表4-4所示: 表4-4 与每个进程相关联的用户ID和组ID 实际用户ID                            我们实际上是谁 实际组ID ...

  9. 设置用户ID和设置组ID

    与一个进程关联的ID有6个或更多,如下图所示: 与每个进程相关联的用户ID和组ID 实际用户ID 实际组ID 我们实际是谁 有效用户ID 有效组ID 附加组ID 用于文件访问权限检索 保存的设置用户I ...

  10. 【转】linux 设置用户id 设置组id

    linux 设置用户id 设置组id   转自 linux 设置用户id 设置组id   最近看apue,简单记录对设置用户id理解(设置组id同理). 1. 相关的id好像很多,共有哪些? 文件2个 ...

随机推荐

  1. linux 的命令 -exec 的使用

    linux中的 exec命令,-exec 后面跟的是linux的 command 命令,exec命令以分号结束‘:’, 该分号前面要放 反斜杠转义 . find . -name jquery.js - ...

  2. flex 无法将“<mx:>”解析为组件执行.解决方法

    转自:http://www.myexception.cn/flex/434924.html 问题描述: flex项目导入早期版本 无法将“<mx:******>”解析为组件执行. 如图: ...

  3. 在Eclipse中开发angularjs

    当然了,直接用Eclipse开发,完全没问题.我只是需要加个智能感知,安装一个Eclipse插件. Eclipse菜单->Help->Eclipse Marketplace 安装完以后,项 ...

  4. Oracle中CBO优化器简介

    Oracle中CBO优化器简介 Oracle数据库中的优化器是SQL分析和执行的优化工具.它负责制定SQL的执行计划,也就是它负责保证SQL的执行计划的效率最高,比如优化器决定Oracle以什么样的方 ...

  5. 软件调试工具——GDB

    1.GDB调试器概述 GDB是GNU开源组织发布的一个强大的程序调试工具,具有查看程序运行状态.设置断点.查看表达式.显示变量等众多功能,是程序员进行Linux编程必须要掌握的一种调试技术. GDB调 ...

  6. [原]理解HTTP之Content-Type

    http://homeway.me/2015/07/19/understand-http-about-content-type/ 0x01.About 查看Restful API 报头插件:utm_s ...

  7. P2P原理

    简单介绍 前面文章在分布式计算泛型中介绍过P2P泛型.他是一种是一种无中心server的对等网络泛型. P2P即Peer-to-Peer的缩写.翻译为点对点或者端对端.就是我们常说的对等计算. P2P ...

  8. 恢复阿里云RDS云数据库MySQL的备份文件到自建数据库

    云数据库MySQL版使用开源软件Percona Xtrabackup对数据库进行备份,所以您可以使用该软件将云数据库MySQL的备份文件恢复到自建数据库中,本文将介绍详细的操作步骤. 关于云数据库My ...

  9. 去掉A标签的虚线框

    outline是css3的一个属性,用的很少. 声明,这是个不能兼容的css属性,在ie6.ie7.遨游浏览器都不兼容. outline控制的到底是什么呢? 当聚焦a标签的时候,在a标签的区域周围会有 ...

  10. JAVA编译器常量

    编译器常量的特点就是:它的值在编译期就可以确定.比如: final int i = 5; 再傻的编译器也能在编译时看出它的值是5,不需要到运行时.对于运行时常量,它的值虽然在运行时初始化后不再发生变化 ...