特殊权限set_uid、set_gid、stick_bit/软链
到目前为止我们所了解到的权限位只有三位为一段,其实还有一位权限,那就是set_uid、set_gid、stick_bit。
*set_uid:该权限针对二进制可执行文件,,使文件在执行阶段具有文件所有者的权限。比如passwd这个命令就具有该权限。当普通用户执行passwd命令时,可以临时得获得root权限,从而可以改密码。
*set_gid:该权限可以作用在文件上(二进制可执行文件),也可以作用在目录上。当作用在文件上时,其功能和set_uid一样,它会使文件在执行阶段具有文件所属组的权限。目录被设置这个权限后,任何用户在此目录下创建的文件都具有和该目录所属的组相同的组。
*stick_bit:可以理解为防删除位。文件是否可以被某用户删除,主要取决于该文件所在的目录是否对该用户具有写权限。如果没有写权限,则这个目录下的所有文件都不能删除,同时也不能添加新的文件,如果希望用户能够添加文件但不能删除该目录下其他用的文件,则可以对父目录增加该权限。设置该权限后,就算用户对目录具有写权限,也不能删除其他用户的文件。
下面我们看下示例,比如passwd命令就设置了set_uid权限,而/tmp/目录则设置了stick_bit权限
[root@localhost ~]# ls -lh /usr/bin/passwd
-rwsr-xr-x. 1 root root 28K 6月 10 2014 /usr/bin/passwd
[root@localhost ~]# ls -ld /tmp/
drwxrwxrwt. 10 root root 4096 12月 22 08:30 /tmp/
这里看到passwd显示的是rws而非传统的rwx,用数字表示为4755。/tmp/显示的是rwt而非rwx,用数字表示为1777,这里4跟1是怎么算的呢,第一位数字可以是0、1(--t)、2(-s-)、3(-st)、4(s--)、5(s-t)、6(ss-)、7(sst),这时我们再看passwd它是s--,所以是4。
配置这些特殊权限的方法和之前一样,我们想给文增加set_uid,那么命令格式为:chmod u+s filename,而去掉这个权限的命令则为chmod u+s filename,同理set_gid就是chmod g+s filename,stick_bit是:chmod o+t dirname。
有时候你会发现set_uid权限为大写S,而不是小写s,比如rwS,这时因为该文件没有x权限所致,不管是大写的S还是小写的s,都表示它存在set_uid或者set_gid权限,同理sticky bit也已一样。
软链接文件/硬连接文件
链接文件分为两种,一种是软链接,一种是硬链接,现在我们就来认识一下这两种链接。
*软连接:软连接是一个独立存在的文件,它相当于windows上的快捷方式,,当读取这个链接文件时,它会把读取的行为转发到该文件所链接的文件上。例如,现在有一个文件a,我们做了一个软连接文件b(一个很小的链接文件),b指向了a,当读取b时,b就会把读取的动作转发到a上,这样就读取了a文件。当我们删除文件a时,文件b不会被删除,但是再次打开b文件的时候,会提示无法打开文件。然而在我们删除b文件的时候,a文件是不会受到影响。
*硬链接:当系统要读取一个文件时,会先读inode的信息,然后根据inode中的信息到块区域将数据取出,而硬链接是直接再建立一个inode链接到文件放置的区域,既进行硬链接时该文件内容没有任何变化,只有增加了一个指向这个文件的inode,并不会额外占用磁盘空间,硬链接有两个限制:(1)不能跨文件系统,因为不用的文件系统有不同的inode table;(2)不能链接目录。
这样看来,似乎硬链接更为安全,因为删除任何一个硬链接文件,还会有其他文件指向那个inode,既然inode存在,那文件的数据块也就存在,可是因为硬链接限制太多了,所以用途上比较受限,而软连接的使用方向较广。现在我们可以学习怎么创建软硬链接,这里我们需要使用的命令为:ln(link)
ln命令的格式为:ln [-s][来源文件][目的文件],该命令常用的参数是-s,如果不加-s选项就是建立硬链接,加-s就是软连接。示例
[root@localhost ~]# mkdir /home/hch/
[root@localhost ~]# cp /etc/passwd /home/hch/
[root@localhost ~]# cd /home/hch/
[root@localhost hch]# ll
总用量 4
-rw-r--r--. 1 root root 885 12月 22 08:35 passwd
[root@localhost hch]# ln passwd passwd-herd
[root@localhost hch]# ll
总用量 8
-rw-r--r--. 2 root root 885 12月 22 08:35 passwd
-rw-r--r--. 2 root root 885 12月 22 08:35 passwd-herd
[root@localhost hch]# du -sk
4 .
ll命令等于ls -l。一开始目录下面只有一个passwd文件,目录总大小为4KB,做了硬链接后,虽然两个文件的大小都为1088B,但目录的总大小并没有变化。我们不妨先删除源文件,然后比较一下。
[root@localhost hch]# rm -f passwd
[root@localhost hch]# ll
总用量 4
-rw-r--r--. 1 root root 885 12月 22 08:35 passwd-herd
[root@localhost hch]# !du
du -sk
4 .
上例中,删除源文件passwd后,文件大小依旧不变。这说明硬链接文件并不会复制数据块,额外占用磁盘空间。
接下来我们看下软链接的一些特性。
[root@localhost hch]# ln -s passwd passwd-soft
[root@localhost hch]# ll
总用量 4
-rw-r--r--. 1 root root 885 12月 22 08:35 passwd-herd
lrwxrwxrwx. 1 root root 6 12月 22 08:39 passwd-soft -> passwd
[root@localhost hch]# head -n1 passwd-soft
head: 无法打开"passwd-soft" 读取数据: 没有那个文件或目录
[root@localhost hch]# ll
上例中,如果删除源文件,则不能读取软链接文件,而且使用命令ll查看,发现颜色也有所变化,这说明目录不可以做硬链接,但可以做软链接