问题来源
问题场景1:在Linux进行开发Web程序,Web root目录下某些目录需要被www用户进行写操作,而开发过程中使用的用户假设为mn,新建的目录和文件默认用户/组为mn:mn,这对www用户来讲是不可写的。最简单的办法是使用chown -R mn:www xxx设置用户/组为mn:www。这样每次有新的文件都需要进行设置,十分不方便。
问题场景2:对于运维人员来讲,需要在dirA目录下新建的文件为groupA组,在dirB目录下新建的文件为groupB组。
解决办法
使用Linux下的特殊权限位即可以实现。例如对于问题场景2中的情况,将dirA目录的用户组设置为groupA,然后添加SGID权限,即:
chgrp groupA dirA/ chmod g+s dirA/
这样得到dirA的目录权限为
drwxrwsr-x
以后在dirA下新的目录具有相同的权限,且用户组为groupA;新建的文件用户组同样为groupA。
如果是已经存在的目录需要同样的设置,使用如下命令:
find /some/dir -type d -exec chgrp www {} + find /some/dir -type d -exec chmod g+s {} +
NB: 上述命令的 {} + 表示将find查找到的所有目录添加到命令后进行执行,而不是对每一个查找到的目录执行一次。
特殊权限知识
Linux下的文件权限除了用户、组、其他的可读(r)、可写(w)、可执行(x)之外,还有三个特殊的权限位,它们是SUID、SGID、SBIT(粘滞位)。
SUID
s出现在文件所有者的x权限位上。
SUID用于可执行文件,使得该文件在执行时具有该文件所有者的权限。
对于没有可执行权限的文件设置SUID,该文件不会具体可执行权限。
chmod u+s somefile
SGID
s出现在文件所属组的x权限上。
SGID用于文件和目录。
对于目录,设置SGID,在该目录下新建的目录同样有SGID权限和所属组。
对于文件,设置SGID,使用该文件执行时具有所属组的权限。
chmod g+s somefile
SBIT
t出现在文件其他的x权限上。
SBIT用于目录。
设置了SBIT的目录,下新建的文件,只有自己和root可以进行删除。