一:档案和目录篇(4)——修改档案权限
1.chgrp——改变所属群组
每个档案都有三个属性,拥有者、群组、其他人,chgrp就可以更改档案的群组,如下

上面1.txt和2.txt的群组都是zyj,相当于在zyj群组中的用户都只能读取档案1.txt和2.txt
接下来我们改变档案的群组为root后就可以修改档案的内容了,如下

2.chown——改变档案拥有者
可以通过chown改变档案的拥有着属性,如下改变档案1.txt的拥有着为zyj

这样档案1.txt的拥有着就改变成了zyj,这样用户zyj就可以更改档案内容了
3.chmod——改变档案权限
此命令可以改变档案的权限,如下

通过上面的命令改变了1.txt的权限,详细为拥有者权限增加执行(x),群组权限增加写(w),其他人权限不变
上面的格式为数字表示法,也可以用字母格式,如下

根据上面的命令,u代表拥有者,g代表群组,o代表其他人,详细表示为拥有者减少写(w),群组减少写(w)、增加执行(x),其他人增加执行(x)
4.档案预设权限—umask
首先查看系统目录或者档案预设权限,如下

这个预设权限的设置有助于新建档案或者目录时默认的权限,如下

我们新建了一个档案3.txt,它的默认权限为-rw-r--r--
新建了一个目录3,它的默认权限为rwx-r-xr-x
大家想想,为什么会是这种权限而不是其他的权限,其实这就是umask设置的,档案和目录的默认权限是不同的
档案主要是存储数据的,所以档案肯定没有执行(x)权限,因为档案执行没有意义,所以档案的开始默认权限为666即rw-rw-rw-,
然后通过上面umask设置的0022,即群组和其他人都减去写的权限,最终档案的默认权限为644。
但是目录是需要执行权限的,所以目录开始权限为777,减去0022后得到755即rwxr-xr-x。
当然我们也可以更改默认权限设置umask的值,如下

更改umask值后,再新建档案和目录时,默认权限变化了,大家自己试试。
5.档案特殊权限——SUID,SGID,SBIT
在上面第4节中,我们用到了umask这个预设权限,如下

数值0022中,后三位022表示预设权限需要减去的权限值,那第一位的数值0代表什么呢,其实第一位0代表的就是特殊权限了
我们先看两个拥有特殊权限的档案

大家仔细看看上面的档案,发现/tmp档案的其他人权限为rwt,/usr/bin/passwd档案的拥有着权限为rws,这是为什么呢,
其实这就是表示这两个档案拥有特殊权限,详细介绍如下
SUID:
上面的/usr/bin/passwd档案其实是具有SUID的特殊权限,SUID即设置在拥有着上面的特殊权限,把拥有者的执行权限(x)改为(s)予以区分
那这个SUID有什么用呢,我们先来看一个档案/etc/shadow的权限

/etc/shadow这个档案是保存系统用户的密码的,所以这个档案只能是root用户来强制写入和读取,
但是我们依然可以使用普通用户去更改自己的密码,按照正常来说,普通用户是不能操作/etc/shadow档案的,
那为什么自己可以更改自己的密码呢,其实这就是SUID的功能了。详细分析如下
1.普通用户对/usr/bin/passwd是具有x权限
2.passwd的拥有者为root
3.在普通用户去执行passwd时,会自动升级为root,然后就可以更改密码了
4.执行完后,普通用户失去root的功能
总结:简单来说,就是拥有SUID的档案在被普通用户执行的过程中,普通用户临时升级为root用户,具有root的功能,然后去执行,
SUID只能针对档案,对目录无效。
SGID:
1.针对于档案:
同理,当s在群组的x上时就成为此档案具有SGID的权限,SGID可以针对档案和目录,对于档案来说和SUID的功能差不多,就是在普通账号执行的过程中获得群组的权限,如下

从上面可以看出档案/usr/bin/locate具有SGID,注意它的群组为slocate,当普通账号使用这个档案时就会临时获得slocate群组的权限,下面看一个档案

档案/var/lib/mlocate/mlocate.db的群组也是slocate,并且群组可以读取档案的内容,不属于群组的其他人不能读取。
此档案为系统里的数据库文件,它包含系统本地所有的文件信息,如果大家查看不到这个档案时,可以先执行updatedb命令更新数据库后,此档案就会自动生成。
而命令locate则是在这个数据库文件中查找是否存在特定的文件档案,所有说执行locate命令就是去读取/var/lib/mlocate/mlocate.db的内容
那么大家想想,如果我使用不属于slocate群组的普通账号去执行locate命令查找文件时能否成功访问/var/lib/mlocate/mlocate.db吗?
其实是可以的,因为这就是SGID的功能了

我在/home/test/目录下新建了一个zyj123.txt的档案,然后updatedb更新数据库文件,然后执行locate命令查找在home/test/目录下是否有zyj123这个档案
结果查找到了文件,但是我用的是普通账号zyj,按照一般情况是不能读取/var/lib/mlocate/mlocate.db这个数据库中的内容的,但是现在可以读取,这就是SGID的功能。
2.针对于目录:
SGID不仅能设置档案,也可以对目录进行设置,当目录被设置为SGID后,有以下的功能
用户若对此目录有r和x权限,则用户可以进入此目录
用户在此目录下的有效群组将会变成此目录的群组
用户若对此目录有w权限,在此目录下新建的档案的群组变为此目录的群组
说了这么多,可能大家还是不太清晰的理解,我们举个例子

在普通目录下新建档案,档案的群组为账号本身
但是当目录设置了SGID后,在目录下新建的档案的群组将会变为目录的群组,如下

当目录设置SGID后,新建的档案就变成了目录的群组man了
SGID设置目录主要运用在项目团队开发中,例如可以新建一个团队的目录,将其设置SGID,那么在这个目录中新建的所以档案的群组都是改目录的群组了,
这样属于这个群组的用户就都可以获得对目录中的档案的相应权限了。
SBIT:
如果在”其他人“的x权限上变成t就说明被设置成了SBIT,这个只能对目录进行设置,详细如下
如果用户对此目录有w,x权限即可以对此目录有写入的功能
当用户在此目录下新建档案或者目录时,仅有自己和root才有权删除该档案或者目录
举例如下:

从上面可以看出,当其他人对目录具有写的权限时,其他人是可以删除别人建立的档案的
当目录设置了SBIT后,就算其他人对目录有写的权限,但是不能删除别人建立的档案

5.档案隐藏属性——chattr,lsattr
档案除了有rwxrwxrwx这九个一般属性外,还有隐藏属性,隐藏属性的设置就用chattr命令,一般常用加-ai的参数,其他参数大家可以自己试试

chattr +i 命令可以将档案保护起来,这样即使是root用户都不能删除了
lsattr 命令就是用来查看隐藏属性的,上面显示i就证明已经被增加了保护功能
chattr -i 命令就可以去掉保护功能