特殊权限set_uid、set_gid、stick_bit、软链接文件、硬链接文件

简介:

一、特殊权限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一个和原文件一样名字的文件后,软链接显示正常。

96472a4dd0c3ae2b0ede93385611f0be.png


做软链接的时候最好用绝对路径!

[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。

5b91ad7bfa63fac7485c58402e64541e.png


[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


相关文章
|
1月前
|
存储 自然语言处理 C++
map和set的简单介绍
map和set的简单介绍
20 1
|
1月前
|
存储 安全 Java
java集合框架及其特点(List、Set、Queue、Map)
java集合框架及其特点(List、Set、Queue、Map)
|
3月前
|
JavaScript 前端开发 定位技术
JavaScript 中如何代理 Set(集合) 和 Map(映射)
JavaScript 中如何代理 Set(集合) 和 Map(映射)
50 0
|
3月前
|
存储 安全 Java
Map和Set(JAVA)
Map和Set(JAVA)
50 1
|
3月前
|
编译器 C++ 容器
【C++学习手札】基于红黑树封装模拟实现map和set
【C++学习手札】基于红黑树封装模拟实现map和set
|
2天前
|
存储 JavaScript 索引
js开发:请解释什么是ES6的Map和Set,以及它们与普通对象和数组的区别。
ES6引入了Map和Set数据结构。Map的键可以是任意类型且有序,与对象的字符串或符号键不同;Set存储唯一值,无重复。两者皆可迭代,支持for...of循环。Map有get、set、has、delete等方法,Set有add、delete、has方法。示例展示了Map和Set的基本操作。
16 3