2.18特殊权限set_uid
passwd支持普通用户自己更改密码,但是linux系统又是很安全的,改密码需要更改一个用于改密码的文件/etc/shadow,ls /etc/shadow查看到权限是000,可谓是相当严谨。root用户是super user,拥有至高无上的权限,即使是000权限,也能对其进行修改。普通用户想密更改密码,但又没有权限,二者看似矛盾,其实可以通过一个特殊的权限set_uid来实现。
![](https://i-blog.csdnimg.cn/blog_migrate/8d5cd1b952b345dbd4ece62066ac59a5.png)
查看到passwd所有者权限的第二位是s, 表示passwd有
set_uid权限,即普通用户执行这个权限的时候,可以被临时赋予该用户所有者的身份以及权限,从而可以更改密码
。给一个用户设置set_uid权限的前提是,这得是一个
可执行的二进制文件
。
给文件授权set_uid权限的方法:eg给ls加个set_uid权限
su - ****
//切换到普通用户,是$开头
whoami //用于查看当前用户
root用户权限是很严谨的,ls是无法查看root用户的.
![](https://i-blog.csdnimg.cn/blog_migrate/1b381d54da6c19124aace0ea87814fce.png)
在root用户模式下,给ls设置一个set_uid权限,就可以临时拥有所有者root用户的身份和权限。
chmod u+s /user/bin/ls
,普通用户模式下查看到ls拥有了set_uid权限。
![](https://i-blog.csdnimg.cn/blog_migrate/34980beaadbf2b60515535528da3e79b.png)
![](https://i-blog.csdnimg.cn/blog_migrate/756c738376f6b0e4f0a7789b0f43786d.png)
此时,普通用户模式下,可以通过ls 可以查看/root了,并且root的权限并没有发生变化,仍然是other用户没有执行的权限,之所以现在能看到root,是因为ls有了set_uid的权限,临时被赋予了所有者root用户的权限。
去除set_uid权限的方法:chmod u-s /usr/bin/ls
另一种写法:
chmod u=rws /usr/bin/ls //显示是的是S
chmod u+x /usr/bin/ls //添上x执行的权限,s变为S
![](https://i-blog.csdnimg.cn/blog_migrate/bff943105da7fc4742ec880af0b94984.png)
即使是S
,没有x执行的权限,但是
不受影响
的,可以查看root,之所以会这样,是因为ls 命令的权限位是drwS-xr-x,
对于ls 的other用户来说,它本身就是有x执行权限的
。大s,小s只是set_uid而已。目录也是可以设置set_uid权限的,不过目录并没有打开的必要,故而没有意义,不需要给目录加上set_uid权限。
![](https://i-blog.csdnimg.cn/blog_migrate/c9c9a135ffbf3df68647b98263e9a335.png)
![](https://i-blog.csdnimg.cn/blog_migrate/98653935e9c81b22e27cab55345556ba.png)
![](https://i-blog.csdnimg.cn/blog_migrate/5f0b17a4b2f00c55f204dc783d0c797e.png)
2.19 特殊权限set_gid
set_gid作用在组权限上,也是s
chmod g+s /usr/bin/ls临时赋予普通用户所属组root的身份,变为黄色,可以作用在文件上,打开查看root
![](https://i-blog.csdnimg.cn/blog_migrate/f9cda98e0c125cc4b605a1d82166cb4d.png)
![](https://i-blog.csdnimg.cn/blog_migrate/61939d98766aa22b0dbdba46c6a9d6b8.png)
![](https://i-blog.csdnimg.cn/blog_migrate/20ec01a94c45175efd73977c47c3ec4a.png)
![](https://i-blog.csdnimg.cn/blog_migrate/bbb25e883245e72723eaf283b645b3d5.png)
root组用户的权限是可读可执行,故给ls设置了set_gid,是可以查看root的
![](https://i-blog.csdnimg.cn/blog_migrate/bc173d6ba7d276100bd331426c6a2dc6.png)
除了可以作用在文件上,set_gid还可以作用在目录上,会使得创建的子文件/子目录的所属组与父籍目录的所属组保持一致。
root用户下创建目录,一般默认所有者和所属组都是root,为了突出对比,我们创建目录123,更改所属组为nihuiping ,添加set_gid权限,在目录234下创建目录nihuiping和文件nihuipinglinux,看到子文件以及子目录的所属组都是nihuiping,接着去除set_gid权限,在目录234下创建子目录nihuiping1和子文件nihuipinglinux1,可以查看到子目录nihuiping1和子文件nihuipinglinux1的所属组都是nihuiping,而不是root,这就是set_gid作用在目录上的功能。
![](https://i-blog.csdnimg.cn/blog_migrate/0cff6c6e7acc9cdf6f2ec958a65d8276.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ef688ab73a7a7d73b96b17733936f225.png)
2.19特殊权限stick_bit
/tmp目录的普通用户权限位是:rwt,是具有x执行权限的,t是防删除位,防止别的用户删除自己的文件(root用户和该普通用户本身除外)
![](https://i-blog.csdnimg.cn/blog_migrate/14ff98cf5193320ded226f85211daf7c.png)
普通用户模式下,cd进入/tmp目录,在其下面创建子文件nihuiping,查看到该子文件的所有者和所属组都是nihuiping,对于该文件是可以进行编辑修改的。
![](https://i-blog.csdnimg.cn/blog_migrate/15856a4b499c1a292fb51ab99f140723.png)
在普通用户nihuiping模式下,将权限更改为777,可以看到文件tmp/nihuiping的所有者和所属组都是nihuiping。
root用户切换至普通用户user1模式下,发现对于普通用户nihuiping下面的文件,可以进行修改,但是无法删除
![](https://i-blog.csdnimg.cn/blog_migrate/f73b277a18bbb4c23d7794561fe80848.png)
![](https://i-blog.csdnimg.cn/blog_migrate/b60e1bd6e08c5b83b9b4f1ddb1170392.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e1f188b629aa9d988ddeeda58b9c2195.png)
在普通用户user1模式下,进入/tmp ,创建目录user1,权限777。
在普通用户nihuiping模式下,在/tmp/user1下创建文件1.txt和目录234。
切换至普工用户user1,模式下,查看到文件1.txt和目录234,other用户并没有w写权限,意味着无法对其进行删除,但实际上是可以删除该文件和目录的。原因是
删除文件/目录,并不是看它本身是否有w删除权限,而是看你想删除的文件和目录所在的父籍目录(所在的那个目录)是否具有w写删除权限,即user1目录权限777
![](https://i-blog.csdnimg.cn/blog_migrate/a10e9b4267b7e90c1735df61d7f3f518.png)
![](https://i-blog.csdnimg.cn/blog_migrate/3e13009a5597b89c3a3d74cad581576f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1d23043fb6ce4d5f8588768e2baca14e.png)
![](https://i-blog.csdnimg.cn/blog_migrate/59af42a17d2a5f1ab23a9bdb97b8e69b.png)
chmod o+t 父籍目录 //添加stick_bit权限
总结
:1、删除目录/文件,需查看想删的目录的
父籍目录,而非本身
2、欲管理删除别的普通用户的文件/目录,除非是root用户;或是普通用户本身;或是该文件/目录的父籍目录权限是777
3、父籍目录有set_bit权限,即使设置了777权限,其他普通用户也无权对别的用户的父籍目录下面的文件/目录进行删除。
2.21软链接文件
bin就是一个软链接文件,
-→后面接着的是真正的文件位置
,即文件本身存了另外一个文件的路径,/bin/ls和/usr/bin/ls其实是一个文件。路径越长,链接文件的大小越大。若是copy一个文件的话,很占空间,但是若是做个
软链接,快捷方式,节省空间
。
![](https://i-blog.csdnimg.cn/blog_migrate/9948757b3b59b72001d8d6252e7611f1.png)
库文件/tmp/lib64/下面库文件特别多,粉绿色,后面有箭头标识的是软链接文件
![](https://i-blog.csdnimg.cn/blog_migrate/136a4c4c75b8725395cc271d6e2e8ed2.png)
文件做软链接方法:ln -s **** *****
eg:把/tmp/yum.log做个软链接到/root/111/yum.log下面去
结果权限不够,是由于111目录有个i权限未去除
![](https://i-blog.csdnimg.cn/blog_migrate/3afa2631ca924f352289ba7a7a537dfe.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c00a432d91cbe9666dc1e670b2303a81.png)
软链接不仅可以链接文件,也可以链接目录
eg:ln -s /tmp/nihuiping /root/111
![](https://i-blog.csdnimg.cn/blog_migrate/0eba24e2e148858fc7fe58817b0a0161.png)
我们会看到一些软链接是做在相对路径上去的这样的软连接仅在当前目录下,有弊端:软连接也是文件,若是将一台机器上的所有文件拷贝到另外一台机器上去,发现源文件不存在,软连接出现问题,所以
做软连接尽量使用绝对路径
![](https://i-blog.csdnimg.cn/blog_migrate/67fa18f9aefad9badcf106cbf7a5da36.png)
之所以这样会报错,是因为yum.log是相对于/root/123下,而/root/123下并没有yum.log,故报错,在/root/123下新建文件yum.log,就不会报错了。做软连接的时候,尽量用绝对路径。
![](https://i-blog.csdnimg.cn/blog_migrate/9eb7681a382bac24b9f52c9ccc140e13.png)
![](https://i-blog.csdnimg.cn/blog_migrate/30c7b3d2b08529378943582126c3e698.png)
df – h查看磁盘分区,工作中会用到的情况,比如/boot/nihuiping所占空间很大,但是路径又不能改动,碰到这种情况,我们可以把
1、/boot/nihuiping cp拷贝到一个较大的磁盘A里面
2、然后删除/boot/nihuiping/
3、接着做个软链接:ln -s 路径A /boot/nihuiping
2.22硬链接
文件的anaconda号通常为1,表示没有相同的文件使用一个anaconda,目录较为特殊,多个目录会使用相同的anaconda。
目录不支持做硬链接,文件可以做硬链接。
![](https://i-blog.csdnimg.cn/blog_migrate/5ae2e843cf79b39dce2862b0211e0dba.png)
查看anaconda号,文件和生成的硬链接文件,这两个文件使用相同的anaconda号,数字为2,
互相为彼此的硬链接文件,不论源与目标,都一样。软链接是一个快捷方式,分为源文件(真正的文件)和目标文件。删除源文件,软链接会报错,硬链接则不会出问题,除了使用相同anaconda号的文件数目变成了1。
![](https://i-blog.csdnimg.cn/blog_migrate/4f75ca887b8984de1753295027bf4267.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e559f847c739d59bd19b6a7442e79e78.png)
文件真正存放文件的,在anaconda上
,存放文件属性,时间,权限等等,
硬链接相当于是anaconda披上一层外皮,删除和多创建几个都无妨,这层皮至少留一层。硬链接不会占用上分空间
,因为anaconda号就一个。若是2个不同的anaconda号,则说明是两个不同的文件。
目录不支持做硬链接,多个目录使用相同的anaconda,anaconda是有联系的,若是做硬链接,会受影响,故目录无法做硬链接。
![](https://i-blog.csdnimg.cn/blog_migrate/1020b4ea58a23d5d47e2dbc53b1c06ca.png)
文件做成硬链接有前提,不能跨分区
。
eg:把/boot/config-3.10-693.el7.x86做成硬链接到/tmp/1.config,结果显示faileed,因为不同分区,可能有相同的anaconda号,但确是独立的,所以跨分许对文件做硬链接是不允许的。anaconda至少要留一层皮,不能全部删除
![](https://i-blog.csdnimg.cn/blog_migrate/eba9de6a0838afaf7f0d6bfe7d8da7b8.png)