一、特殊权限set_uid
set_uid:改权限针对二进制可执行文件,使文件在执行阶段具有文件所有者的权限。比如,passwd这个命令就具有该权限。当普通用户执行passwd命令时,可以临时获得root权限,从而可以更改密码。
该权限作用在所有者的x权限位上。
[root@centos-01 tmp]# which passwd
/usr/bin/passwd
[root@centos-01 tmp]# ls -l /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 6月 10 2014 /usr/bin/passwd
#s权限就是set_uid
密码文件:/etc/shadow
[root@centos-01 tmp]# ls -l /etc/shadow
----------. 1 root root 634 10月 19 21:10 /etc/shadow
/etc/shadow 的权限为000。从权限上来看,root用户和普通用户是无法修改的。但有一点,root用户毕竟是superuser(超级用户),他是有至高无上的权限的,即使是000权限,他也能给这个文件授权权限的。
当passwd被授予了s权限的时候,它就能让普通用户在执行这个命令时临时具有root用的权限。
给一个文件授权set_uid权限
[root@centos-01 ~]# su - huang #切换到huang这个用户
[huang@centos-01 ~]$ whoami #查看当前系统用户
huang
[huang@centos-01 ~]$ ls /root/ #查看 /root/ 目录了信息
ls: 无法打开目录/root/: 权限不够 #提示权限不够
[huang@centos-01 ~]$ ls -ld /root/ #查看/root/目录的信息,可知,其他用户权限是0.
dr-xr-x---. 3 root root 175 10月 23 21:37 /root/
[root@centos-01 tmp]# chmod u+s /usr/bin/ls #给ls加上set_uid权限
[root@centos-01 tmp]# ls -l /usr/bin/ls #查看ls的信息,可知ls已经具有了set_uid权限。
-rwsr-xr-x. 1 root root 117656 11月 6 2016 /usr/bin/ls #所有者权限的x变成了s。
切换到普通用户huang
[huang@centos-01 ~]$ ls /root/ #查看/root/目录
anaconda-ks.cfg #发现可以查看到root目录的信息
ls命令加上set_uid权限后,普通用户在执行ls命令时,会临时具有root的权限。
chmod u=rws 文件 rwS------
chmod u=rwxs 文件 rws------
大S,是因为u本身没有x权限。小s,是因为u本身有x权限。
不管大s还是小s,都不影响,因为S、s本身就具有执行含义。
二、特殊权限set_gid
set_gid 该权限作用于用户组的x权限位上。改权限可作用于目录和权限。
set_gid和set_uid 作用在文件上时,效果大概是一样的。普通用户临时拥有所属组的身份。
set_gid作用于目录上目录上时,当创建子目录(子文件)时候,创建子目录(子文件)的所属组和该目录的所属组保持一致。
[root@localhost ~]# chmod g+s /usr/bin/ls #给ls加上set_gid权限
[root@localhost ~]# ls -l /usr/bin/ls #查看ls信息
-rwxr-sr-x. 1 root root 117656 11月 6 2016 /usr/bin/ls
#ls的组权限x位变成了s,可知ls所属的组为root
[root@localhost ~]# su - huang #切换到普通用户huang
[huang@localhost ~]$ ls /root/ #查看/root/目录
anaconda-ks.cfg
#可以用ls查看/root/目录。说明huang这个用户在ls有set_gid权限的情况下,在执行ls命令时,huang这个用户具有和root组用户相同的权限。
[root@localhost ~]# mkdir test #创建一个test目录
[root@localhost ~]# chgrp huang test #修改test目录的所属组为huang
[root@localhost ~]# ls -ld test #查看目录信息
drwxr-xr-x. 2 root huang 6 10月 25 10:56 test
[root@localhost ~]# mkdir test/abc #在test目录下创建目录abc
[root@localhost ~]# touch test/123.txt #在test目录下创建文件123.txt
[root@localhost ~]# ls -l test #查看目录信息
-rw-r--r--. 1 root root 0 10月 25 10:58 123.txt
drwxr-xr-x. 2 root root 6 10月 25 10:58 abc
# 123.txt文件和abc目录的所有者和所属组都是root
[root@localhost ~]# chmod g+s test #给test目录加上set_gid权限
[root@localhost ~]# ls -ld test #查看目录信息
drwxr-sr-x. 3 root huang 32 10月 25 10:58 test #已经成功加上set_gid权限,且所属组为huang。
[root@localhost ~]# touch test/456.txt #在test目录下创建文件456.txt
[root@localhost ~]# mkdir test/def #在test目录下创建目录def
[root@localhost ~]# ls -l test #查看目录信息
-rw-r--r--. 1 root root 0 10月 25 10:58 123.txt
-rw-r--r--. 1 root huang 0 10月 25 11:02 456.txt
drwxr-xr-x. 2 root root 6 10月 25 10:58 abc
drwxr-sr-x. 2 root huang 6 10月 25 11:02 def
#在创建目录和文件时都没有切换用户。
test目录没加set_gid权限前,root用户在test目录下创建的目录(abc)和文件(123.txt)所有者为root,所属组为root。
test目录加上set_gid权限后,root用户在test目录下创建的目录(def)和文件(456.txt)所有者为root,所属组变成了 huang。
如果目录具有set_gid权限,在该目录下创建新的目录(文件)时,新创建的目录(文件)所属组会变成与原目录相同。
三、特殊权限stick_bit
stick_bit 防删除位,防止别人删除自己的文件,root用户除外。系统中/tmp 目录具有该权限。该权限在其他用户权限x位上为t。
[root@localhost ~]# ls -ld /tmp/
drwxrwxrwt. 9 root root 263 10月 25 11:36 /tmp/
#该目录的权限是777,所有用户都可以在这个目录下创建文件。
[huang@localhost tmp]$ whoami #查看当前用户
huang #当前用户为huang
[huang@localhost tmp]$ vi a.txt #新建a.txt文件,并在里面输入内容
[huang@localhost tmp]$ chmod 777 a.txt #给a.txt文件加上777权限
[huang@localhost tmp]$ ls -l a.txt #查看文件属性
-rwxrwxrwx. 1 huang huang 8 10月 25 14:35 a.txt
切换用户到 huang2
[huang2@localhost tmp]$ whoami #查看当前用户
huang2 #当前用户为huang2
[huang2@localhost tmp]$ vi a.txt #编辑刚才的a.txt文件,发现能编辑成功
[huang2@localhost tmp]$ rm -f a.txt #删除a.txt文件,不能删除
rm: 无法删除"a.txt": 不允许的操作
[huang2@localhost tmp]$ mv a.txt b.txt #重命名也不能执行
mv: 无法将"a.txt" 移动至"b.txt": 不允许的操作
因为stick_bit权限是放删除,所以即使给了777权限,其他用户也无法删除(root除外)
[huang@localhost tmp]$ mkdir abc #创建abc目录
[huang@localhost tmp]$ chmod 777 abc #给abc目录加上777权限
切换到huang2用户
[huang2@localhost tmp]$ touch abc/1.txt #在abc目录下新建文件1.txt
[huang2@localhost tmp]$ mkdir abc/123 #在abc目录下新建目录123
切换回huang用户
[huang@localhost tmp]$ cd abc #进入abc目录
[huang@localhost abc]$ ls -l #查看目录
drwxrwxr-x. 2 huang2 huang2 6 10月 25 14:52 123
#目录所有者是huang,目录对其他用户没有w权限
-rw-rw-r--. 1 huang2 huang2 0 10月 25 14:52 1.txt
#文件所有者是huang,文件对其他用户没有w权限
[huang@localhost abc]$ rm -r 123 #删除目录123,删除成功
rm:是否删除有写保护的目录 "123"?y
[huang@localhost abc]$ rm 1.txt #删除文件1.txt,删除成功
rm:是否删除有写保护的普通空文件 "1.txt"?y
目录A下有目录B和文件C,能不能对目录B和文件C进行操作不是看它们的权限,而是看目录A的权限。如果给目录A加上stick_bit(防删除位)那就不能删除它们了。
四、软链接文件
软链接类似于windows系统中的快捷方式
/bin 就是一个软链接文件,真正的目录应该是/uer/bin。
[root@localhost /]# ls -l /bin
lrwxrwxrwx. 1 root root 7 10月 17 18:18 /bin -> usr/bin
#路径越长,软链接文件就越大
ln -s 原文件 目标文件(软链接文件)
[root@localhost ~]# ln -s /tmp/yum.log /root/test/yum.log
#将/tmp/下yum.log文件软链接到/root/test/目录下yum.log文件
[root@localhost ~]# ls -l /root/test/
lrwxrwxrwx. 1 root root 12 10月 25 16:52 yum.log -> /tmp/yum.log #软链接
软链接不仅可以链接文件,还可以链接目录。
[root@localhost ~]# ln -s /tmp/abc/ /root/test/
#将/tmp/abc/目录软链接到/root/test/目录下(/root/test/abc)
[root@localhost ~]# ls -l /root/test/
lrwxrwxrwx. 1 root root 9 10月 25 16:58 abc -> /tmp/abc/ #软链接
lrwxrwxrwx. 1 root root 12 10月 25 16:52 yum.log -> /tmp/yum.log #软链接
当软链接在同一个目录下时,原文件(目录)就显示为相对路径
[root@localhost tmp]# ln -s yum.log testlinux.log
#将在同一目录下的yum.log文件软链接到testlinux.log文件
[root@localhost tmp]# ls -l
lrwxrwxrwx. 1 root root 7 10月 25 17:07 testlinux.log -> yum.log #不含绝对路径的软链接
-rw-------. 1 root root 0 10月 17 18:18 yum.log
相对路径的软链接仅仅是在当前目录下。假设文件被移动了,源不存在,这时软链接就会出问题。
软链接不存在时,软链接的原文件会闪红色。touch一个和原文件一样名字的文件后,软链接显示正常。
做软链接的时候最好用绝对路径!
[root@localhost /]# ls -l /root/test/
总用量 0
lrwxrwxrwx. 1 root root 9 10月 25 16:58 abc -> /tmp/abc/
lrwxrwxrwx. 1 root root 12 10月 25 16:52 yum.log -> /tmp/yum.log
#yum.log文件软链接到/tmp/yum.log文件
[root@localhost /]# mv /root/test/yum.log /tmp/aaa
[root@localhost /]# ls -l /tmp/aaa/
总用量 0
lrwxrwxrwx. 1 root root 12 10月 25 16:52 yum.log -> /tmp/yum.log
#移动yum.log文件后,软链接依然正常。
原文件用绝对路径的软链接,不会因为目标文件的移动而链接错误。
五、硬链接文件
硬链接只是在某个目录下新建一条文件名链接到某个inode号码的关联记录而已。硬链接可以让多个文件名对应到同一个inode号码。硬链接不支持目录,只支持文件。
硬链接不能跨分区,硬链接可以删除源文件,硬链接比较大的用处就是用于备份。
ln 源文件 目标文件
[root@centos-01 test]# ln 1.txt 1_hard.txt
#将1.txt文件硬链接到1_hard.txt文件
[root@centos-01 test]# ln -s 1.txt 1_soft.txt
#将1.txt文件软链接到1_sofr.txt文件
[root@centos-01 test]# ls -lh #查看当前目录信息
总用量 16K
-rw-r--r--. 2 root root 4.1K 10月 25 21:29 1_hard.txt
lrwxrwxrwx. 1 root root 5 10月 25 21:33 1_soft.txt -> 1.txt
-rw-r--r--. 2 root root 4.1K 10月 25 21:29 1.txt
#硬链接文件和源文件一样大(硬链接文件和源文件使用了同一个inode号),文件连接数都为2(在做硬链接之前,源文件的文件链接数为1)。软链接只是一个快捷方式。
删除源文件后,软链接会有警告提示,硬链接没有什么大的变化,只是连接数减少了1。
[root@centos-01 test]# ls -i #查看文件inode
50680263 1_hard.txt 50680262 1_soft.txt 50680263 1.txt
#硬链接和源文件用同一个inode
文件做硬链接不能跨分区
[root@centos-01 ~]# df -h #查看磁盘空间
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda3 26G 1.1G 25G 5% /
devtmpfs 903M 0 903M 0% /dev
tmpfs 912M 0 912M 0% /dev/shm
tmpfs 912M 8.6M 904M 1% /run
tmpfs 912M 0 912M 0% /sys/fs/cgroup
/dev/sda1 197M 109M 88M 56% /boot
tmpfs 183M 0 183M 0% /run/user/0
[root@centos-01 ~]# ln /boot/config-3.10.0-514.el7.x86_64 /tmp/config.1
#将/boot/config-3...文件做硬链接到/tmp/config.1文件
ln: 无法创建硬链接"/tmp/config.1" => "/boot/config-3.10.0-514.el7.x86_64":无效的跨设备连接 #提示
分区之间有独立的inode体系,不同分区可能存在相同的inode号码,所以跨分区不能做硬链接。
硬链接就像无数张皮一样包裹着inode,可以删除很多张皮,但是至少要保留一张皮来保护inode。
本文转自 豆渣锅 51CTO博客,原文链接:http://blog.51cto.com/754599082/1976364