在看《鸟哥的Linux私房菜》的过程中,关于SUID和SGID有了自己的一点心得体会,来这里发表一下!
首先说SUID,这个权限的含义就是当一个用户运行一个程序的时候,如果这个程序有SUID权限,那么这个程序运行时的所属用户不是运行这个程序的用户,而是这个程序的所属用户。举个例子:chfn这个程序,如下图:
这个程序是属于root的,且具有SUID权限,其他用户具有运行权限,如果我用一个普通用户vbird来运行会发生什么情况呢?请看下图:
vbird是一个普通用户,当vbird运行这个程序的时候,我用root去查找系统中关于chfn的进程,会发现这个进程的所有者是root,这就是SUID。
接下来再讲一下SGID,我个人感觉关于进程的SGID权限和SUID差不多,这里没有什么难点。主要是在于关于文件夹的。如果一个文件夹拥有SGID权限的话,那么其他用户进入到这个文件之后,有效用户组都是这个文件夹的用户组,即创建的文件或者文件夹的用户组都是这个文件夹的用户组。这句话听起来可能比较拗口,接下来举个例子,就很好理解了。
首先,介绍用户和组,我这里有一个用户michael,其主组也是michael,附属组是一个project。如下图:
michael的主组是michael意味着michael登录后,默认的有效组就是michael,即michael创建一个一个文件或者文件夹,默认都是属于michael组的。
现在,有一个文件夹project,拥有SGID权限,且所属组为project,那么michael在里面创建文件或者文件夹会发生什么情况呢?请看下图:
大家请看,我创建的文件test和文件夹dtest都是属于project组的,而不是属于michael组,且dtest文件夹也拥有SGID的权限。这就是sgid的功能。
最后,我是有个想法,如果michael的附属组里面不包含project,那么michael在project/这个文件夹里面创建东西会怎么样呢?我特地实验了一下,发现创建的文件还是和原来一样,这就出现了一种很神奇的情况,某个文件所属的用户和所属的组并没有任何关系。如下图: