目录
一、 特殊权限set_uid
二、 特殊权限set_gid
三、 特殊权限stick_bit
四、 软链接文件
五、 硬连接文件
一、 特殊权限set_uid
set uid:该权限针对二进制可执行文件,使文件在执行阶段具有文件所有者的权限。
比如,passwd这个命令就具有这个权限。当普通用户执行passwd命令时,可以临时获得root权限,从而可以更改密码。示例命令如下:
[root@minglinux ~]# ls -l /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 6月 10 2014 /usr/bin/passwd
这里的rws权限中的s就代表set_uid权限。
再举一个例子:
首先我们切换到普通用户ming,然后使用ls
命令查看/root目录,发现提示权限不够,因为/root目录是比较严谨的,只有root用户才能查看。
[root@minglinux-01 ~]# su ming
[ming@minglinux-01 root]$ whoami
ming
[ming@minglinux-01 root]$ ls /root/
ls: 无法打开目录/root/: 权限不够
[ming@minglinux-01 root]$ ls -ld /root/
dr-xr-x---. 7 root root 240 9月 15 00:42 /root/
那此时我们给ls
这个命令加上set_uid,相当于让普通用户在执行ls
期间能临时拥有root用户的权限。所以ming用户再次使用ls /root/
可以成功显示结果。示例命令如下:
[root@minglinux-01 ~]# whoami
root
[root@minglinux-01 ~]# chmod u+s /usr/bin/ls
[root@minglinux-01 ~]# ls -l /usr/bin/ls
-rwsr-xr-x. 1 root root 117672 4月 11 12:35 /usr/bin/ls
[ming@minglinux-01 root]$ whoami
ming
[ming@minglinux-01 root]$ ls /root/
1.txt anaconda-ks.cfg dir1 dir2 dir3 dir4
二、 特殊权限set_gid
set gid:该权限可以作用在文件上(二进制可执行文件),也可以作用在目录上。
- 当作用在文件上时,它会使文件在执行阶段具有文件所属组的权限。示例如下:
[root@minglinux-01 ~]# ls -l /usr/bin/ls
-rwxr-xr-x. 1 root root 117672 4月 11 12:35 /usr/bin/ls
[root@minglinux-01 ~]# chmod g+s /usr/bin/ls
[root@minglinux-01 ~]# ls -l /usr/bin/ls
-rwxr-sr-x. 1 root root 117672 4月 11 12:35 /usr/bin/ls
我们给ls
命令加了set_gid权限,即ls
执行时具有文件ls所属的root组的权限,而root组对/root目录有r-x权限,所以此时ming用户也临时拥有了root组的权限,可以成功执行ls /root/
命令。
[ming@minglinux-01 root]$ ls /root
1.txt anaconda-ks.cfg dir1 dir2 dir3 dir4
- 当作用在目录上时,任何用户在此目录下创建的文件都具有和该目录所属组相同的组。命令如下:
[root@minglinux-01 ~]# mkdir 123
[root@minglinux-01 ~]# chmod g+s 123
[root@minglinux-01 ~]# ls -ld 123
drwxr-sr-x. 2 root root 6 9月 18 07:10 123
[root@minglinux-01 ~]# chown :user1 123
[root@minglinux-01 ~]# ls -ld 123
drwxr-sr-x. 2 root user1 6 9月 18 07:10 123
[root@minglinux-01 ~]# mkdir 123/456
[root@minglinux-01 ~]# ls -ld 123/456/
drwxr-sr-x. 2 root user1 6 9月 18 07:11 123/456/
[root@minglinux-01 ~]# touch 123/test
[root@minglinux-01 ~]# ls -l 123/test
-rw-r--r--. 1 root user1 0 9月 18 07:11 123/test
取消了123目录的set_gid权限后,在此目录下创建的文件和目录的所属组都变成了root组,而不是123目录所属的组。命令显示如下:
[root@minglinux-01 ~]# chmod g-s 123
[root@minglinux-01 ~]# ls -ld 123
drwxr-xr-x. 4 root user1 53 9月 18 07:17 123
[root@minglinux-01 ~]# mkdir 123/789
[root@minglinux-01 ~]# ls -ld 123/789/
drwxr-xr-x. 2 root root 6 9月 18 07:19 123/789/
[root@minglinux-01 ~]# touch 123/test2
[root@minglinux-01 ~]# ls -l 123/test2
-rw-r--r--. 1 root root 0 9月 18 07:19 123/test2
三、 特殊权限sticky_bit
sticky bit:可以理解为防删除位。如果希望用户能够添加文件但不能删除该目录下其他用户的文件,则可以对父目录增加该权限。设置该权限后,就算用户对目录具有写权限,也不能删除其他用户的文件。
示例:
[root@minglinux ~]# ls -ld /tmp/
drwxrwxrwt. 9 root root 230 9月 17 11:32 /tmp/
[ming@minglinux-01 root]$ whoami
ming
[ming@minglinux-01 root]$ cd /tmp/
[ming@minglinux-01 tmp]$ ls
ls2 test test_mv vmware-root
[ming@minglinux-01 tmp]$ touch ming
[ming@minglinux-01 tmp]$ ll
总用量 116
-rwxr-xr-x. 1 root root 117672 9月 13 21:41 ls2
-rw-rw-r--. 1 ming ming 0 9月 18 07:29 ming
drwxr-xr-x. 2 root root 19 9月 12 22:18 test
drwxr-xr-x. 3 root root 18 9月 13 23:14 test_mv
drwx------. 2 root root 6 9月 5 17:15 vmware-root
[ming@minglinux-01 tmp]$ vi ming
[ming@minglinux-01 tmp]$ chmod 777 ming
[ming@minglinux-01 tmp]$ ll ming
-rwxrwxrwx. 1 ming ming 35 9月 18 07:29 ming
[user1@minglinux-01 tmp]$ whoami
user1
[user1@minglinux-01 tmp]$ rm -rf ming
rm: 无法删除"ming": 不允许的操作
上例中可以看到,由于/tmp/具有sticky权限,所以任一用户不能删除该目录下其他用户的文件。
- 配置特殊权限的命令总结:
chmod u+s filename
设置set uid权限
chmod u-s filename
删除set uid权限
chmod g+s dirname
设置set gid权限
chmod g-s dirname
删除set gid权限
chmod o+t dirname
设置sticky权限
chmod o-t dirname
删除sticky权限
有时候,set_uid上的权限为大写的S,而不是小写的s,这是因为改文件没有x权限所致,不管是大写S还是小写s,都表示它存在set_uid或者set_gid权限,同理sticky bit也一样。
ps:根据前面示例可以发现,passwd显示的是rws而非传统的rwx,用数字表示为4755。/tmp/显示的rwt而非rwx,用数字表示为1777。这个7和1是如何计出来的呢?当有特殊权限时,第一位数字可以是0、1(--t)、2(-s-)、3(-st)、4(s--)、5(s-t)、6(ss-)、或7(sst)。回过头来看passwd,它是s--,所以是4;而/tmp/是--t,所以是1。
四、 软链接文件
软链接(symbolic link):软链接建立一个独立的文件,当读取这个链接文件时,它就会把读取的行为转发到该文件所链接到的文件上。当删除链接指向的文件时,链接文件不会被删除,但无法打开;当删除链接文件时,链接指向的文件不受影响。
五、 硬连接文件
硬链接(hard link):当系统要读取一个文件时,会先读取inode信息,然后在根据inode中的信息到块区域将数据读取出来。而硬链接是直接再建立一个inode链接到文件放置的块区域,即进行硬链接时该文件内容没有任何变化,只是增加了一个指向这个文件的inode,并不会额外占用磁盘空间。硬链接有两个限制:(1)不能跨文件系统,因为不同的文件系统又不同的inode table;(2)不能链接目录。
-
ln命令
ln
即link的缩写。ln
命令的格式为:ln [-s] [来源文件] [目的文件],该命令常用的选项是-s。加-s选项就是建立软链接,不加就是建立硬链接。
硬链接相关示例命令如下:
[root@minglinux ~]# mkdir /tmp/4_9
[root@minglinux ~]# cd /tmp/4_9
[root@minglinux 4_9]# cp /etc/passwd ./
[root@minglinux 4_9]# ls -l
总用量 4
-rw-r--r--. 1 root root 995 9月 17 15:30 passwd
[root@minglinux 4_9]# du -sk
4 .
[root@minglinux 4_9]# ln passwd passwd-hard
[root@minglinux 4_9]# ll
总用量 8
-rw-r--r--. 2 root root 995 9月 17 15:30 passwd
-rw-r--r--. 2 root root 995 9月 17 15:30 passwd-hard
[root@minglinux 4_9]# du -sk
4 .
一开始目录下只有一个passwd文件,目录总大小为4KB。做了硬链接后,虽然两个文件的大小都为995B,但目录的总大小并没有变化。删除源文件再比较一下,命令如下:
[root@minglinux 4_9]# rm -f passwd
[root@minglinux 4_9]# ll
总用量 4
-rw-r--r--. 1 root root 995 9月 17 15:30 passwd-hard
由此可知删除源文件passwd后,文件大小依旧不变。这说明硬链接文件并不会复制数据块,额外占用磁盘空间。
硬链接不能跨分区,示例如下:
[root@minglinux-01 ~]# ln /boot/config-3.10.0-862.el7.x86_64 /tmp/config.1
ln: 无法创建硬链接"/tmp/config.1" => "/boot/config-3.10.0-862.el7.x86_64": 无效的跨设备连接
硬链接不能链接目录,示例命令如下:
[root@minglinux 4_9]# mkdir 123
[root@minglinux 4_9]# ln 123 456
ln: "123": 不允许将硬链接指向目录
软链接相关示例命令:
[root@minglinux 4_9]# mkdir 456
[root@minglinux 4_9]# cd 456
[root@minglinux 456]# cp /etc/passwd ./
[root@minglinux 456]# ln -s passwd passwd-soft
[root@minglinux 456]# ll
总用量 4
-rw-r--r--. 1 root root 995 9月 17 16:50 passwd
lrwxrwxrwx. 1 root root 6 9月 17 16:50 passwd-soft -> passwd
[root@minglinux 456]# head -1 passwd
root:x:0:0:root:/root:/bin/bash
[root@minglinux 456]# head -1 passwd-soft
root:x:0:0:root:/root:/bin/bash
[root@minglinux 456]# rm -f passwd
[root@minglinux 456]# head -1 passwd-soft
head: 无法打开"passwd-soft" 读取数据: 没有那个文件或目录
[root@minglinux 456]# ll
总用量 0
lrwxrwxrwx. 1 root root 6 9月 17 16:50 passwd-soft -> passwd
上例中可以知道,如果删除源文件,则不能读取软链接文件。另外,目录不可以做硬链接,但可以做软链接,示例命令如下:
[root@minglinux 456]# cd ..
[root@minglinux 4_9]# ls
123 456 passwd-hard
[root@minglinux 4_9]# ln 456 789
ln: "456": 不允许将硬链接指向目录
[root@minglinux 4_9]# ln -s 456 789
[root@minglinux 4_9]# ls -ld 456 789
drwxr-xr-x. 2 root root 25 9月 17 16:52 456
lrwxrwxrwx. 1 root root 3 9月 17 16:56 789 -> 456
还有需要注意的一点是做软链接尽量使用绝对路径,因为若使用路径,当源文件移动到其他目录时,软链接会出错找不到源文件。