2.18 特殊权限set_uid
[root@localhost ~]# which passwd
/usr/bin/passwd
[root@localhost ~]# ls -l /usr/bin/passwd
-
rwsr-xr-x. 1 root root 27832 6月 10 2014 /usr/bin/passwd //这里文件是红色的
这里的“s”就是set_uid权限。是什么权限呢?
对于系统用户来说,修改密码是个重要的事情了。root用户可以修改普通用户的密码,同时普通用户也可以修改自己的密码。所以这里的“s”就是这个权限了,但是还有一个问题:存放用户密码的文件是:
[root@localhost ~]# ls -l /etc/shadow
----------. 1 root root 609 6月 2 20:30 /etc/shadow
没有任何人有任何权限【当然root除外,因为root需要写入时可以先修改文件为可写然后写入,然后再将权限修改回来。
而这的set_uid权限是:让普通用户临时拥有该命令所有者的身份。
那么给一个文件设置set_uid的条件前提是:这个文件是一个二进制的,可执行的文件(比如ls命令passwd命令的命令文件)
怎么给一个文件授权set_uid权限呢?
[root@localhost ~]# su - xiao
上一次登录:一 6月 4 22:02:53 CST 2018pts/0 上
[xiao@localhost ~]$ ls /root
ls: 无法打开目录/root: 权限不够
[xiao@localhost ~]$ exit
登出
[root@localhost ~]# chmod u+s /usr/bin/ls
[root@localhost ~]# ls -l /usr/bin/ls
-rwsr-xr-x. 1 root root 117656 11月 6 2016 /usr/bin/ls //文件名底部会变成红色
[root@localhost ~]# su - xiao
上一次登录:二 6月 5 23:17:50 CST 2018pts/0 上
[xiao@localhost ~]$ ls /root
1 1.txt 1.txt~ 2.txt anaconda-ks.cfg
取消set_uid权限:
[root@localhost ~]# chmod
u-s /usr/bin/ls
[root@localhost ~]# ls -l /usr/bin/ls
-rwxr-xr-x. 1 root root 117656 11月 6 2016 /usr/bin/ls
另外一种设置方法:
[root@localhost ~]# ls -l /usr/bin/ls
-rwxr-xr-x. 1 root root 117656 11月 6 2016 /usr/bin/ls
[root@localhost ~]# chmod
u=rws /usr/bin/ls //通过这样的直接设置,结果有略微出入
[root@localhost ~]# ls -l /usr/bin/ls
-rw
Sr-xr-x. 1 root root 117656 11月 6 2016 /usr/bin/ls //
这里是“S”,因为没有“x”权限了。
[root@localhost ~]# chmod u+x /usr/bin/ls //单独加上之后,就回到“s”了 .[root@localhost ~]# ls -l /usr/bin/ls
-rwsr-xr-x. 1 root root 117656 11月 6 2016 /usr/bin/ls
注意:特殊权限位,如果是“S”,那么意味着目录属主没有执行权限,但是这里ls还是可以执行;那是因为对于普通用户这个其他用户来说是有“x”权限的。那么这里测试,如果other用户没有了可执行“x”权限,结果如何:
[root@localhost ~]# chmod o-x /usr/bin/ls
[root@localhost ~]# ls -l /usr/bin/ls
-rwSr-xr--. 1 root root 117656 11月 6 2016 /usr/bin/ls
[root@localhost ~]# su - xiao
上一次登录:二 6月 5 23:18:17 CST 2018pts/0 上
[xiao@localhost ~]$ ls /root/
-bash: /bin/ls: 权限不够
//显然,即使有“S”权限,普通用户本身对目录没有可执行权限也是不行的
2.19 特殊权限set_gid
set_uid是属主特殊权限,set_gid是对组来说的。
[root@localhost ~]# ls -l /usr/bin/ls
-rwxr-xr--. 1 root root 117656 11月 6 2016 /usr/bin/ls
[root@localhost ~]# chmod
g+s /usr/bin/ls
[root@localhost ~]# ls -l /usr/bin/ls
-rwxr-
sr--. 1 root root 117656 11月 6 2016
/usr/bin/ls //文件名底部会变成黄色。
功能:作用在文件上时,让普通用户临时拥有所属组的身份。还可以作用在目录上。
首先一个小花絮:上次课程的隐藏权限没有修改回来,导致了这个小问题。
[root@localhost ~]# chmod g+s 1
chmod: 更改"1" 的权限: 不允许的操作
[root@localhost ~]# lsattr 1
----i----------- 1/2
----i----------- 1/a.txt
----i----------- 1/b.txt
[root@localhost ~]# lsattr -d 1
----i----------- 1
[root@localhost ~]# chattr -i 1
[root@localhost ~]# chmod g+s 1
[root@localhost ~]# ls -ld 1
drwxrwsr--. 3 root root 41 6月 4 22:44 1
[root@localhost ~]# chown .xiao 1
[root@localhost ~]# ll -d 1
drwxrwsr--. 3 root xiao 41 6月 4 22:44 1
[root@localhost ~]# touch 1/text.txt
[root@localhost ~]# ls -ld 1/text.txt
-rw-r--r--. 1 root
xiao 0 6月 5 23:41 1/text.txt //如果没有set_gid权限时,使用root用户创建的文件,所有者所属组都是root。
设置了set_gid时,那么创建的文件属组会跟父级目录相同。
2.20 特殊权限 stick_bit
[root@localhost ~]# ls -ld /tmp/
drwxrwxrw
t. 8 root root 104 6月 4 03:11
/tmp/ //这里的“t”就是stick_bit,防删除位。谁的文件谁做主,其他人没有权限删除,root除外(其他用户可以修改文件内容)。
上面图片可以看出:对一个目录下面的子文件子目录的删除权限并不是看子文件子目录本身,而是它们的父级目录权限,是否有写的删除权限。
特殊权限一般用的比较少,所以,了解即可。
2.21 软链接文件
软链接类似win下面的快捷方式。
[root@localhost ~]# ls -l /bin
lrwxrwxrwx. 1 root root 7 5月 30 07:01 /bin -> usr/bin
[root@localhost ~]# ls /bin/ls
/bin/ls
[root@localhost ~]# ls /usr/bin/ls
/usr/bin/ls
/lib64文件中的软链接文件可以说是最多的。一般来说,如果需要一个相同内容,但是名字不同并且文件容量还比较大时,就非常何时使用软链接了。并且,拷贝出了操作麻烦,还需要考虑到文件内容的修改问题,而软链接的两个文件会相互修改,更加省事。
设置软链接:
[root@localhost ~]# mkdir 1
[root@localhost ~]# mkdir 2
[root@localhost ~]# touch 1/a.txt
[root@localhost ~]# ln -s
/root/1/a.txt /root/2/ //红色字体是链接文件的源文件,后面是目标目录
[root@localhost ~]# ls -l 2/ //查看连接情况
总用量 0
lrwxrwxrwx. 1 root root 13 6月 6 00:06 a.txt -> /root/1/a.txt
[root@localhost ~]# ln -s /root/1/a.txt /root/2/b.txt //还可以修改名字链接过去。
[root@localhost ~]# ls -l 2/
总用量 0
lrwxrwxrwx. 1 root root 13 6月 6 00:08 b.txt -> /root/1/a.txt
如果软链接文件都在相同目录,那么可以使用相对路径;但是这样做会有弊端:当文件进行拷贝到其他地方之后,软链接会失效或异常。所以
软链接尽量使用绝对路径
[root@localhost 1]# ln -s a.txt b.txt
[root@localhost 1]# ls -l
总用量 0
-rw-r--r--. 1 root root 0 6月 6 00:06 a.txt
lrwxrwxrwx. 1 root root 5 6月 6 00:10 b.txt -> a.txt
软链接源文件所在位置,是文件存储的实际位置,所以当出现某个分区的空间不足,可以使用软链接的方式,将该内容进行迁移,挪到其他空间的分区。
比如,有个服务,产生的文件在/boot/xiao.log,但是/boot分区本身就很小,所以,需要将大的日志文件进行迁移:
】# cp /boot/xiao.log /xiao.log
】# rm /boot/xiao.log; ln -s /xiao.log /boot/xiao.log
如此操作即可。这也是非常实际的关于软链接的使用。软链接可以对文件操作,也可以对目录操作
2.22 硬链接文件
硬链接:
不支持对目录做硬链接
[root@localhost ~]# ls -l 1/
总用量 4
-rw-r--r--. 1 root root
1440 6月 6 00:26 a.txt
[root@localhost ~]# ln /root/1/a.txt /root/2/
[root@localhost ~]# ls -l 2
总用量 4
-rw-r--r--. 2 root root
1440 6月 6 00:26 a.txt //硬链接文件跟源文件的大小一致
[root@localhost ~]# ls -i 1/a.txt
480808 1/a.txt
[root@localhost ~]# ls -i 2/a.txt //两者的inode号一致。
480808 2/a.txt
硬链接特性:
1)两个文件互为硬链接文件。且一个文件删除,不影响另一个文件(而软链接中删除了源文件,目标文件会失效)
2)不能对目录做硬链接
[root@localhost ~]# ln /root/1/ /root/2/a
ln: "/root/1/": 不允许将硬链接指向目录
3)文件做硬链接:不能够跨分区。
[root@localhost ~]# ln /boot/config-3.10.0-693.el7.x86_64 /tmp/config.1
ln: 无法创建硬链接"/tmp/config.1" => "/boot/config-3.10.0-693.el7.x86_64": 无效的跨设备连接
因为两个分区存在相同的inode