2.18 特殊权限set_uid
- set_uid(s):该权限针对二进制可执行文件使文件在执行阶段具有文件所有者的权限。
- 可以使用chmod u+(-)s 【二进制文件名】 来设置权限。
- 相当于set_uid设置user的权限位。
[root@hf ~]# which passwd
/usr/bin/passwd
[root@hf ~]# ls -l /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 3月 10 2014 /usr/bin/passwd
- set_uid命令,就是保证普通用户临时拥有该命令所有者的身份
给一个文件设置set_uid拥有临时所有者的权限
- 前提,是该文件必须是二进制文件,而且是一个可执行(x)的文件
-
- 例如:ls,passwd这些文件就是二进制文件
- 而像,1.txt去设置set_uid权限是没有意义的
- 小写的s包括了x权限,大写的S表示没有x权限
ls命令的绝对路径为 /usr/bin/ls
[root@hf ~]# chmod u+s /usr/bin/ls
[root@hf ~]# chmod u-s /usr/bin/ls
[root@hf ~]# chmod u=rws /usr/bin/ls
[root@hf ~]# !ls
ls -l /usr/bin/ls
-rwSr-xr-x. 1 root root 117616 6月 10 2014 /usr/bin/ls
[root@hf ~]# chmod u+x /usr/bin/ls
[root@hf ~]# !ls
ls -l /usr/bin/ls
-rwsr-xr-x. 1 root root 117616 3月 10 2014 /usr/bin/ls
[root@hf ~]#
- 目录可增加set_uid权限,但是基本没啥作用,目录基本不用去执行啥
- set_uid权限本身的作用就是给一个普通用户的用户执行,临时拥有所有者的身份
2.19 特殊权限set_gid
set_gid(s):可作用于文件(二进制可执行文件)和目录。
- 相当于set_gid 设置group组的权限位。
- 可以使用chmod g+(-) 【文件名/目录名】 来设置权限。
- 也就是将标志s加到gid的x标志位,sgid用在目录上最多。
set_gid作用在文件上时,和set_uid效果一致,会使普通用户临时拥有所属组的身份
[root@hf ~]# ls -l
总用量 8
-rw-r--r--. 1 root root 0 3月 26 08:39 11.txt
drwxr-xr-x. 2 root root 6 3月 26 08:39 123
drwxrwxr-x. 2 root root 6 3月 26 08:57 234
-rwxrwxrwx. 1 root root 924 3月 25 06:49 2.txt
-rw-rw-r--. 1 root root 0 3月 26 08:56 33.txt
-rw-------. 1 root root 973 3月 21 05:05 anaconda-ks.cfg.1
-rw-rw-r--. 1 root root 0 3月 26 09:41 ha.txt
dr-x--xr-x. 2 root root 18 3月 26 06:56 hf
[root@hf ~]# chmod g+s 234
[root@hf ~]# ls -ld 234
drwxrwsr-x. 2 root root 6 3月 26 08:57 234
[root@hf ~]# chown :hanfeng 234
[root@hf ~]# ls -ld 234
drwxrwsr-x. 2 root hanfeng 6 3月 26 08:57 234
[root@hf ~]# touch 234/gurui
[root@hf ~]# ls -l 234/
总用量 0
-rw-r--r--. 1 root hanfeng 0 10月 27 07:46 gurui
[root@hf ~]# mkdir 234/am
[root@hf ~]# ls -l 234/
总用量 0
drwxr-sr-x. 2 root hanfeng 6 3月 27 07:47 am
-rw-r--r--. 1 root hanfeng 0 3月 27 07:46 gurui
[root@hf ~]# chmod g-s 234
[root@hf ~]# touch 234/gurui111
[root@hf ~]# !ls
ls -l 234/
总用量 0
drwxr-sr-x. 2 root hanfeng 6 3月 27 07:47 am
-rw-r--r--. 1 root hanfeng 0 3月 27 07:46 gurui
-rw-r--r--. 1 root root 0 3月 27 07:48 gurui111
[root@hf ~]# mkdir 234/am1
[root@hf ~]# ls -l 234/
总用量 0
drwxr-sr-x. 2 root hanfeng 6 3月 27 07:47 am
drwxr-xr-x. 2 root root 6 3月 27 07:49 am1
-rw-r--r--. 1 root hanfeng 0 3月 27 07:46 gurui
-rw-r--r--. 1 root root 0 3月 27 07:48 gurui111
当给一个目录设置了set_gid之后,再去这个目录下面创建子目录和子文件的时候,那这个子文件和子目录的所属组会跟着父级目录(就是刚刚创建的set_gid权限的目录)保持一致。
set_gid这个权限的作用,他不仅仅可以作用在文件上,也可以作用在目录上
- 当作用在文件上,和set_uid作用类似,可以让执行文件的普通用户临时拥有所属组的身份。
- 当作用在目录上,在创建子目录和子文件的时候,子目录和子文件所属组和该目录的所属组保持一致
2.20 特殊权限stick_bit
系统中的/tmp/目录是拥有stick_bit权限的
[root@hf ~]# ls -ld /tmp/
drwxrwxrwt. 9 root root 4096 3月 27 05:14 /tmp/
- 这drwxrwxrwt.里面的t(t里面包含x权限),就是stick_bit权限,
- stick_bit(t):又叫做防删除位。只对目录有效,对文件无效。
- 在/tmp/下有很多类似的文件,拥有777权限,说明任何一个用户都可对这个目录可写,并创建自己的文件
[root@hf ~]# cd /tmp/
[root@hf tmp]# ls
aminglinux amning mysql.sock yum.log
- 在/tmp/下有很多类似的文件,拥有777权限,说明任何一个用户都可对这个目录可写,并创建自己的文件
- 相当于stick-bit设置others权限位。
stick_bit权限叫防删除位,只有有权限的用户(比如root)才可以删除,而其他的用户是根本无法删除掉的
- 就是防止别人删除自己的文件(root用户除外)
- 文件是否可以被某用户删除,主要取决于该文件所在的目录是否对该用户具有写权限。如果没有写权限,则这个目录下的所有文件都不能删除,同时也不能添加新的文件。
- 如果希望用户能够添加文件,但是不能删除该目录下其他用户的文件,则可以对该目录增加这个权限。
设置该权限后,就算用户对目录具有写权限,也不能删除其他用户的文件。
有时候,set-uid上的权限为大写的S,而不是小写的s。这是因为该文件没有x权限所致,不管是大写的S还是小写s,都表示它存在set-uid和set-gid权限。同理stick-bit也一样。
- 当有特殊权限时,第一位数字可以是0、1(–t)、2(-s-)、3(-st)、4(s–)、5(s-t)、6(ss-)、7(sst),这里的“(—)”,分别指user、group、others的权限位(rwx rwx rwx)。
如:/tmp是–t,所以第一位为1,所以/tmp权限用数字表示为1777。 - 文件的读写执行权限不要和目录的读写执行权限混淆。
- 比如:一个文件设置了可写权限,但目录未设置可写权限,表示不能删除该文件,但文件内容是可编辑的。
- 一个目录设置了可写权限,但目录下文件没有可写权限,表示可删除该文件,但该文件不能编辑。能否删除一个文件或者目录,看得是这个文件或目录所在的父目录的权限,能否删除和文件本身的权限无关。
2.21 软链接文件
- 命令ln(link)
- 格式:ln【-s】 【来源文件】【目的文件】
- -s 建立软链接,不加-s建立硬链接。
链接文件分为硬链接文件(hard link)和软链接文件(symbolic link),两种链接的本质区别在于inode。
- 软链接文件:是建立一个独立的文件,当读取这个链接文件时,它会把读取的行为转发到该文件所链接的文件上。做软链接尽量使用绝对路径。
软链接其实就是在一个文件本身存了另一个文件目录的路径。链接文件的大小适合路径是有关系的,路径越长,那这个软链接文件越大
软链接就像是windows中的快捷方式,可以很大程度的节省磁盘空间
- ln -s 源文件 软链接文件
[root@hf ~]# ls
11.txt 123 234 2.txt 33.txt anaconda-ks.cfg.1 ha.txt hf
[root@hf ~]# cd /tmp/
[root@hf tmp]# ls
aminglinux amning mysql.sock user1 yum.log yunwei
[root@hf tmp]# ln -s /tmp/yum.log /root/123/yum.log
[root@hf tmp]# ls -l /root/123/
总用量 0
lrwxrwxrwx. 1 root root 12 3月 30 05:44 yum.log -> /tmp/yum.log
- 不仅可以链接文件,还可以链接目录
[root@hf-01 tmp]# ln -s /tmp/amning/ /root/amning111
[root@hf-01 tmp]# ls -l !$
ls -l /root/amning111
lrwxrwxrwx. 1 root root 12 10月 30 05:51 /root/amning111 -> /tmp/amning/
- 在/tmp/目录下,源文件aa.log链接——》目标文件ss.log
[root@hf tmp]# ls -l
总用量 4
-rw-r--r--. 1 root root 0 3月 30 06:09 aa.log
srwxrwxrwx. 1 mysql mysql 0 3月 30 04:49 mysql.sock
drwxrwxrwx. 2 user1 user1 6 3月 27 09:07 user1
[root@hf tmp]# ln -s aa.log ss.log
[root@hf tmp]# ls -l
总用量 4
-rw-r--r--. 1 root root 0 3月 30 06:09 aa.log
srwxrwxrwx. 1 mysql mysql 0 3月 30 04:49 mysql.sock
lrwxrwxrwx. 1 root root 6 3月 30 06:13 ss.log -> aa.log
- 弊端——假设做了一个相对路径的软链接,再把所有的文件拷贝到另一台机器上的时候(软链接本身也是一个文件),结果会发现这个文件不存在,(也就是源不存在),所以尽量使用绝对路径
- 尽量使用绝对路径,这样就会避免文件的不存在
2.22 硬连接文件
硬链接:当系统要读取一个文件时,会先读inode信息,然后再根据inode中的信息到块区域将数据取出来。而硬链接是直接再建立一个inode链接到文件放置的块区域。即建立硬链接时该文件内容没有变化,只是增加了一个指向这个文件的inode,并不会额外占用磁盘空间。
硬链接不支持对目录做链接,只支持对文件做链接
硬链接, 软链接 对比:会发现软链接很小,硬链接很大
- ls -i 查看inode号
- 会发现硬链接文件和源文件使用了同一个inode号,大小相同,可使用find命令查找到硬链接
[root@localhost ~]# ls -l
总用量 32
drwxr-xr-x. 3 root root 45 10月 26 16:11 111
-rw-r--r--. 1 root root 0 10月 26 15:54 111.12.txt
-rw-r--r--. 2 root root 391 10月 30 15:10 1_heard.txt
lrwxrwxrwx. 1 root root 5 10月 30 15:06 1_sorft.txt -> 1.txt
[root@localhost ~]# ls -i
33584735 111 33575033 1_sorft.txt 33575034 2.txt 33574987 anaconda-ks.cfg
33584737 111.12.txt 33575035 1.txt 33584734 3.txt 33575006 anaconda-ks.cfg.1
33575035 1_heard.txt 33584733 1.txt~ 33584736 3.txt~ 33575036 windows.txt
- 硬链接文件特性,就是创建的文件和另外一个文件是相同的inode号,这两个文件相互为硬链接文件。(软链接文件是有原有的目标,它有一个真正的文件,软链接仅仅为一个快捷方式)
- 再删除源文件后,会发现==软链接==一直闪烁,表示找不到源文件了,那这个软链接文件就没有用了
- 再删除源文件后,会发现==硬链接==,会发现正常使用,但inode会变成1
[root@localhost ~]# rm 1.txt
rm:是否删除普通文件 "1.txt"?y
[root@localhost ~]# ls -l
总用量 28
drwxr-xr-x. 3 root root 45 10月 26 16:11 111
-rw-r--r--. 1 root root 0 10月 26 15:54 111.12.txt
-rw-r--r--. 1 root root 391 10月 30 15:10 1_heard.txt
lrwxrwxrwx. 1 root root 5 10月 30 15:06 1_sorft.txt -> 1.txt
- 真正存数据的地方,存这个文件信息的位置在inode上
- inode号代表着一个inode,inode是存在于文件系统中特殊的东西,这个inode会去记录一些文件的属性,如文件的时间、权限、位置等
[root@localhost ~]# ls -i 1_heard.txt
33575035 1_heard.txt
硬链接不会占用双份空间,因为使用的同一个inode
硬链接的限制:
目录不能做硬链接
[root@hf ~]# ln 111 hf11 在硬链接指向目录的时候,会提示错误 ln: "111": 不允许将硬链接指向目录
不能跨文件系统(跨分区),因为不同的文件系统有不同的inode,不同的table目录体系。
[root@hf ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda3 18G 1.1G 17G 6% /
devtmpfs 483M 0 483M 0% /dev
tmpfs 493M 0 493M 0% /dev/shm
tmpfs 493M 6.7M 486M 2% /run
tmpfs 493M 0 493M 0% /sys/fs/cgroup
/dev/sda1 197M 109M 88M 56% /boot
tmpfs 99M 0 99M 0% /run/user/0
[root@localhost ~]# ls -i /boot/
71 config-3.10.0-514.el7.x86_64
67 grub
131136 grub2
76 initramfs-0-rescue-513f8b3950084e768a99df3a6cd3d9e6.img
75 initramfs-3.10.0-514.el7.x86_64.img
189445 initramfs-3.10.0-514.el7.x86_64kdump.img
74 initrd-plymouth.img
72 symvers-3.10.0-514.el7.x86_64.gz
70 System.map-3.10.0-514.el7.x86_64
77 vmlinuz-0-rescue-513f8b3950084e768a99df3a6cd3d9e6
73 vmlinuz-3.10.0-514.el7.x86_64
[root@hf ~]# ln /boot/config-3.10.0-514.el7.x86_64 /tmp/conifg.1
ln: 无法创建硬链接"/tmp/conifg.1" => "/boot/config-3.10.0-514.el7.x86_64": 无效的跨设备连接
- 硬链接总结
- 硬链接文件不能跨分区创建,因为每个分区都有各自的inode。
- 比如、:d1分区有a文件的inode号是88,而d2分区的b文件的inode号也是88.
- 正是因为各个分区的inode号各自为营,如果跨分区创建硬链接文件就会导致混乱。
- 为了避免这个问题,所以不允许跨分区创建硬链接文件。
- 硬链接可以删除,因为使用了相同的inode
显示无法创建硬链接