“ 本文正在参加「金石计划 . 瓜分6万现金大奖」 ”
12.1 文件权限介绍
12.1.1 文件权限简介
Linux系统中文件权限与文件对应的用户及用户组关联很大,因此要想学习权限部分的知识,需要先了解一下Linux系统中用户与用户组方面的基本知识,并提前介绍了Linux系统文件权限的基础,在阅读本章之前,建议读者点详细阅读9.2节和9.3节,以了解用户和权限的基础知识,相关内容本章不在讲述。
12.1.2 文件权限位说明
根据前文的介绍,Linux文件或目录的基础权限位是由9个字符来控制的,每三位字符为一组,下面就通过表12-1从另一个维度来说明一下文件权限的重点知识。
表12-1 Linux系统9位基础权限知识说明表
12.2 Linux文件及木兰权限核心知识说明
12.2.1 普通文件对应读、写、执行权限的详细说明
现在我们已经知道Linux权限中r、w、x、"-"字符分别代表的基本含义了,那么对应到实际的Linux中,它在普通文件中代表的权限又是怎样的呢?别着急,接下来就为大家讲解。
Linux系统中的权限对于文件和目录来说,是有一定区别的,下面先列举一下普通文件对应的权限的重要知识。
1)可读r:表示具有读取、浏览文件内容(即读取文件实体block)的权限。
2)可写w:表示具有新增、修改、删除文件内容的权限。
3)可执行x:表示具有执行文件的权限。
其中,对于可读r,这里有两点需要做进一步说明。
- 如果没有可读r的配合,那么使用vim编辑文件时会提示无法编辑(但可强制编辑覆盖文件),可以使用echo等命令进行重定向或追加内容到文件。
- 删除、移动或创建文件等的权限是受父目录(上一级目录)的权限控制的(因为文件名没有存放在Inode里,而是在上级目录的block里存放着的,若修改上级目录的block(删除文件本体),当然会受到上级目录的Inode的权限控制),与文件本身的权限无关,因此,文件本身的可写w权限,与文件是否能被删除和改名无关。
对于可执行x,需要注意以下3点。
- 首先文件的本身要能够执行(文件为命令或脚本)。
- 如果是普通用户,同时还需要具备可读r的权限才能执行文件。
- 而root用户只要有可执行x的权限就能执行。
12.2.2 目录对应读、写、执行权限的详细说明
Linux系统中目录的权限和文件的权限有一些细微的区别,下面是目录对应的权限的重要知识。
1)可读r:表示具有浏览目录下面文件及子目录名的权限, 例如,可执行ls dir命令查看目录下的内容。但是如果没有可执行x权限的配合,则不能切换到指定目录里,即无法执行cd dir命令,而且在执行ls命令查看列表时,虽然可以看到所有的文件名,但是会提示无权限房屋目录下的文件。执行ls -l命令查看列表目录下的文件属性时,所有文件对应的属性都会带有问号,也会提示无权访问目录下的文件,但是依然可以看到所有的文件名。
2)可写w:表示具有增加、删除或修改目录内文件的权限。 但是,如果没有课执行x权限的配合,即使有w权限,也无法删除或创建文件。
3)可执行x:表示具有进入目录的权限。 例如,可以执行cd dir命令切换到目录下,但是无法列表目录下的文件及子目录。
上述的描述可能比较枯燥,不好理解,下面就来一起搭建测试环境,通过实践来理解上述的总结。
12.3 Linux权限体系核心知识实践
12.3.1 权限实践环境准备
12.3.1.1 规划三种不同的用户角色
为了更好地测试文件及目录实际对应的权限,笔者规划了一系列不同的用户角色,如表12-2所示。
表12-2 权限实践环境三种不同用户角色规划
12.3.1.2 创建对应的用户及用户组角色
1)创建一个用户组名字为incahome,命令如下:
[root@centos7 ~]# groupadd incahome #groupadd是添加用户组的命令。
2) 创建neteagle用户,并使之属于incahome这个组,相当于让家庭主人neteagle成为用户组incahome这个家的家庭成员,命令如下:
[root@centos7 ~]# userdel -r neteagle
#如果之前已经创建了neteagle用户,就先删除再创建。
[root@centos7 ~]# useradd neteagle -g incahome
#添加neteagle用户并加入incahome组。
[root@centos7 ~]# id neteagle #查看创建的neteagle用户及所属组的信息。
uid=1004(neteagle) gid=1005(incahome) groups=1005(incahome)
#发现已经更改为了incahome。
[root@centos7 ~]# passwd neteagle #设置密码
Changing password for user neteagle.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
3)添加女主人younggirl用户,并使之也属于incahome这个组,相当于让younggirl成为incahome这个家的家庭成员,命令如下:
[root@centos7 ~]# useradd younggirl -g incahome #添加younggirl用户并加入incahome组。
[root@centos7 ~]# id younggirl #查看创建的younggirl用户及所属组的信息。
uid=1005(younggirl) gid=1005(incahome) groups=1005(incahome)
[root@centos7 ~]# passwd younggirl #设置密码
Changing password for user younggirl.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
4)添加一个其他用户test,表示与neteagle、younggirl没有任何关联的其他组的其他人,命令如下:
[root@centos7 ~]# useradd test
[root@centos7 ~]# id test
uid=1006(test) gid=1006(test) groups=1006(test)
[root@centos7 ~]# passwd test
Changing password for user test.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
12.3.1.3 创建用于测试的目录及文件环境
创建的命令如下:
[root@centos7 ~]# mkdir /neteagle #在根目录下创建测试目录neteagle。
[root@centos7 ~]# echo "echo neteagleLinux" > /neteagle/test.sh
#生成脚本文件test.sh,内容是打印neteagleLinux字符串。
[root@centos7 ~]# cat /neteagle/test.sh
echo neteagleLinux
[root@centos7 ~]# chmod +x /neteagle/test.sh #添加执行权限,chmod的使用详见本章后文。
[root@centos7 ~]# ll /neteagle/test.sh #查看授权后的权限属性。
-rwxr-xr-x. 1 root root 19 Oct 15 19:14 /neteagle/test.sh
12.3.1.4 打开远程窗口,并登录
打开4个Xshell SSH远程登录窗口,并分别使用root、neteagle、younggirl、test用户角色进行登录,其中root窗口是用来修改文件属性的,其他3个窗口则是用来测试对应权限是否符合预期,设置好后不同窗口的登录情况如图12-1所示。
图12-1 Xshell SSH远程登录不同窗口用户角色说明
[C:~]$ ssh neteagle@10.0.0.201
Connecting to 10.0.0.201:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.
WARNING! The remote SSH server rejected X11 forwarding request.
Last failed login: Thu Oct 15 19:23:28 CST 2020 from 10.0.0.1 on ssh:notty
There was 1 failed login attempt since the last successful login.
Wellcome to Linux!
[neteagle@centos7 ~]$
[C:~]$ ssh younggirl@10.0.0.201
Connecting to 10.0.0.201:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.
WARNING! The remote SSH server rejected X11 forwarding request.
Wellcome to Linux!
[younggirl@centos7 ~]$
[C:~]$ ssh test@10.0.0.201
Connecting to 10.0.0.201:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.
WARNING! The remote SSH server rejected X11 forwarding request.
Wellcome to Linux!
[test@centos7 ~]$
12.3.2 通过实践测试文件对应权限
12.3.2.1 测试默认情况下不同用户的对应权限
待测试文件及目录的默认属性如下:
[root@centos7 ~]# ll -d /neteagle/
drwxr-xr-x. 2 root root 21 Oct 15 19:14 /neteagle/
[root@centos7 ~]# ll -d /neteagle/test.sh
-rwxr-xr-x. 1 root root 19 Oct 15 19:14 /neteagle/test.sh
请读者分别测试neteagle、younggirl、test用户针对上述test.sh文件的权限,并给出结论,看看预测的结论与下文的结论是否一致。
下面是测试的命令集合:
测试读r的命令为:cat /neteagle/test.sh
测试写w的命令为:echo "echo neteagle" >>/neteagle/test.sh
测试执行x的命令为:/neteagle/test.sh
测试删除的命令为:rm -f /neteagle/test.sh
经过测试,你会发现三个用户的测试结果一致。因此,这里将只以neteagle用户为例针对操作过程进行整理。命令如下:
[neteagle@centos7 ~]$ cat /neteagle/test.sh #可以查看文件内容,说明有读文件的权限。
echo neteagleLinux
[neteagle@centos7 ~]$ echo "echo neteagle" >>/neteagle/test.sh #往文件里追加内容。
-bash: /neteagle/test.sh: Permission denied #提示拒绝,不能往文件里追加内容,说明不能写。
[neteagle@centos7 ~]$ /neteagle/test.sh #执行后有打印输出,说明有执行的权限。
neteagleLinux
[neteagle@centos7 ~]$ rm -f /neteagle/test.sh #测试一下删除文件。
rm: cannot remove ‘/neteagle/test.sh’: Permission denied #依然提示拒绝。
对于上述test.sh文件来说,用户和组都是root,因此,相对test.sh文件来说,neteagle、younggirl、test这三个用户都是其他用户角色,即针对test.sh的权限查看最后三维(r-x),可以发现,它们都有读和执行的权限。
综上所述,neteagle、younggirl、test三个用户针对上述test.sh文件都拥有同样的其他用户(Other)权限,即读和执行,但都没有写的权限。可能有读者会思考,因为“r-x”中位置没有w,所以不可写文件,这没有错,但是不能删除文件是不是也因为没有这个w呢?后面测试时加上w权限之后再删除看考。
12.3.2.2 在root窗口将与文件对应的用户改为neteagle,用户组改为incahome。
具体步骤如下:
[root@centos7 ~]# chown neteagle.incahome /neteagle/test.sh #将文件所属的用户改为neteagle,组改为incahome。
[root@centos7 ~]# ll /neteagle/test.sh #查看修改后的结果。
-rwxr-xr-x. 1 neteagle incahome 19 Oct 15 19:36 /neteagle/test.sh
提示:neteagle用户对test.sh的权限,可查看前3位,即“rwx”;younggirl用户属于incahome组,因此,对test.sh的权限,可查看中间三位,即“r-x”;test用户则查看后三位,即“r-x”。
然后,请读者再分别测试neteagle、younggirl、test用户对上述test.sh文件的权限,并给出结论。
根据文件属性信息可知,test.sh的所有者已经改为neteagle用户,所以neteagle用户对test.sh的权限看前三位(rwx),可以得知,它具有读、写和执行的权限。登录neteagle用户窗口的实践步骤如下:【1】
[neteagle@centos7 ~]$ whoami
neteagle
[neteagle@centos7 ~]$ cat /neteagle/test.sh #可以浏览内容。
echo neteagleLinux
[neteagle@centos7 ~]$ echo "echo neteagle" >>/neteagle/test.sh #可以追加(写)内容。
[neteagle@centos7 ~]$ cat /neteagle/test.sh #查看追加结果。
echo neteagleLinux
echo neteagle
[neteagle@centos7 ~]$ /neteagle/test.sh #可以执行文件。
neteagleLinux
neteagle
测试结论:neteagle用户对test.sh拥有的权限要看前三位(rwx),可以看出,其具有读、写和执行的权限。
下面同样根据文件属性信息来进行测试,这里test.sh对应的用户组已经改为了incahome,而younggirl属于incahome组,因此,younggirl对test.sh的权限就看中间三位(r-x),可以看出,它具有读和执行的权限,而无写入文件的权限。登录younggirl用户窗口的实践步骤如下:
[younggirl@centos7 ~]$ whoami
younggirl
[younggirl@centos7 ~]$ cat /neteagle/test.sh #可以浏览内容。
echo neteagleLinux
echo neteagle
[younggirl@centos7 ~]$ echo "echo neteagle" >>/neteagle/test.sh #不可以写入,这一点符合预期。
-bash: /neteagle/test.sh: Permission denied
[younggirl@centos7 ~]$ /neteagle/test.sh #可以执行。
neteagleLinux
neteagle
[younggirl@centos7 ~]$ rm -f /neteagle/test.sh #不能删除文件。
rm: cannot remove ‘/neteagle/test.sh’: Permission denied
测试结论:younggirl 用户对test.sh文件拥有对应用户组(incahome)的权限,即读和执行的权限,没有写权限。
下面还是根据文件的属性信息进行测试,这里test,sh对应的用户neteagle和用户组incahome都与test用户毫无关系,因此,test用户对test.sh的权限就看结尾三位(r-x),它具有读和执行的权限,而无写入文件的权限。由于所有的实践步骤和结果都等同于younggirl用户,因此这里不再讲述。
最终结论:test用户对于test.sh文件拥有对应其他用户位的权限,即读和执行的权限,没有写的权限。
12.3.2.3 重点测试neteagle用户对文件的w删除权限及test用户的执行权限
将test.sh中其他用户权限的r权限去掉,具体步骤如下:
[root@centos7 ~]# chmod 751 /neteagle/test.sh
[root@centos7 ~]# ll /neteagle/test.sh
-rwxr-x--x. 1 neteagle incahome 33 Oct 15 19:53 /neteagle/test.sh #其他用户权限的r权限已经去掉。
下面测试neteagle用户下是否有删除test.sh的权限,命令如下:
[neteagle@centos7 ~]$ rm -f /neteagle/test.sh #依然无法删除,neteagle用户对于test.sh来说是用户,权限看前三位,不是有w权限么?为什么删除不了呢?
rm: cannot remove ‘/neteagle/test.sh’: Permission denied
现在测试test用户下是否有执行test.sh的权限,命令如下:
[test@centos7 ~]$ /neteagle/test.sh #其他用户位有x权限,但是仍然无法执行。
bash: /neteagle/test.sh: Permission denied
测试结论总结如下。
- neteagle用户无删除test.sh的权限,即使有w属性也不想,原因后文会将。
- test用户无执行权限,即使有x权限,普通用户想要执行文件,也必须要有r和x权限才行。
- 文件的w或x权限要能顺利生效,也必须要有r权限的配合,因为读不了文件内容,那么修改文件和执行文件都是有问题的。
12.3.2.4 修改/neteagle目录的权限,并测试neteagle 用户对neteagle目录下test.sh的删除权限
具体步骤如下:
[root@centos7 ~]# chmod 000 /neteagle/test.sh #将文件调整为无任何权限。
[root@centos7 ~]# ll /neteagle/test.sh
----------. 1 neteagle incahome 33 Oct 15 19:53 /neteagle/test.sh #查看调整结果。
[root@centos7 ~]# chown -R neteagle /neteagle/ #将test.sh的上级目录所属的用户修改为neteagle。
[root@centos7 ~]# ll -d /neteagle/ #查看调整结果。
drwxr-xr-x. 2 neteagle root 21 Oct 15 19:14 /neteagle/
测试分析,根据test.sh文件属性信息可知,neteagle用户对test.sh的权限看前三位(---),即无任何权限,测试步骤取消:
[neteagle@centos7 ~]$ cat /neteagle/test.sh
cat: /neteagle/test.sh: Permission denied #无法查看内容,符合预期。
[neteagle@centos7 ~]$ echo "echo neteagle" >>/neteagle/test.sh
-bash: /neteagle/test.sh: Permission denied #无法追加修改内容,符合预期。
[neteagle@centos7 ~]$ /neteagle/test.sh
-bash: /neteagle/test.sh: Permission denied #无法执行,符合预期。
[neteagle@centos7 ~]$ rm -f /neteagle/test.sh #但是可以删除文件,神器吧。
[neteagle@centos7 ~]$ ll /neteagle/test.sh
ls: cannot access /neteagle/test.sh: No such file or directory #文件已找不到。
测试结论:删除test.sh文件与文件本身的属性无关,而与上级目录对应的用户权限是否有w权限有关。出现这个问题的原因是:前面章节已经讲解国,文件名不是文件的属性,文件名存在于上一级目录的block里面,删除文件就相当于是删除了文件名,即修改了上级目录的Block信息,因此,必然会受上级目录权限的控制,这是目录w权限的真正作用,即删除目录下的文件和修改文件名。
12.3.3 通过实践测试目录属性对应的权限
12.3.3.1 针对当下目录/neteagle属性测试权限
查看当下目录/neteagle属性,命令如下:
[root@centos7 ~]# ll -d /neteagle/
drwxr-xr-x. 2 neteagle root 6 Oct 15 20:18 /neteagle/
通过上述命令可知,/neteagle目录的用户为neteagle,用户组为root,因此,neteagle用户对/neteagle目录下的内容的权限看前三位(rwx),可以得知,其具备浏览neteagle目录下内容的权限、删除neteagle目录下文件的权限和切换到neteagle目录下的权限。而younggirl及test用户对于/neteagle目录权限的属性来说,都属于其他用户角色,因此,对应权限都看最后三位(r-x),即都有浏览neteagle目录下内容的权限、切换到neteagle目录下的权限,但是无删除neteagle目录下文件的权限。测试实践过程如下。
使用neteagle用户进行测试:
[neteagle@centos7 ~]$ whoami
neteagle
[neteagle@centos7 ~]$ ll -d /neteagle/
drwxr-xr-x. 2 neteagle root 6 Oct 15 20:18 /neteagle/
[neteagle@centos7 ~]$ touch /neteagle/{1..3}.txt #在neteagle目录下创建文件是可以的,这是neteagle目录用户位中w权限的作用。
[neteagle@centos7 ~]$ ls /neteagle/ #类别目录下的内容也可以,这是neteagle目录用户位中r权限的作用。
1.txt 2.txt 3.txt
[neteagle@centos7 ~]$ ll /neteagle/ #列表目录下的内容及属性信息也是可以的,这是neteagle目录用户位中r权限的作用。
total 0
-rw-r--r--. 1 neteagle incahome 0 Oct 15 20:32 1.txt
-rw-r--r--. 1 neteagle incahome 0 Oct 15 20:32 2.txt
-rw-r--r--. 1 neteagle incahome 0 Oct 15 20:32 3.txt
[neteagle@centos7 ~]$ cd /neteagle/ #切换到neteagle目录下也可以,这是neteagle目录用户位中x权限的作用。
[neteagle@centos7 /neteagle]$ pwd
/neteagle
[neteagle@centos7 /neteagle]$ rm -f 1.txt #可以删除目录下的文件,这是neteagle目录用户位中w权限的作用。
[neteagle@centos7 /neteagle]$ ls
2.txt 3.txt
在使用younggirl、test用户测试时,会发现二者的权限相同,因此这里进以younggirl用户为例进行讲解,测试过程如下:
[younggirl@centos7 ~]$ whoami
younggirl
[younggirl@centos7 ~]$ ll -d /neteagle/
drwxr-xr-x. 2 neteagle root 32 Oct 15 20:33 /neteagle/ #younggirl对应权限看最后三位(r-x)。
[younggirl@centos7 ~]$ ls /neteagle/ #可以列表文件名,因为具有r权限。
2.txt 3.txt
[younggirl@centos7 ~]$ ll /neteagle/ #可以列表属性信息。
total 0
-rw-r--r--. 1 neteagle incahome 0 Oct 15 20:32 2.txt
-rw-r--r--. 1 neteagle incahome 0 Oct 15 20:32 3.txt
[younggirl@centos7 ~]$ touch /neteagle/{a..c}.txt #无法创建文件,因为没有w权限。
touch: cannot touch ‘/neteagle/a.txt’: Permission denied
touch: cannot touch ‘/neteagle/b.txt’: Permission denied
touch: cannot touch ‘/neteagle/c.txt’: Permission denied
[younggirl@centos7 ~]$ cd /neteagle/ #可以切换到neteagle目录,因为有w权限。
[younggirl@centos7 /neteagle]$ pwd
/neteagle
[younggirl@centos7 /neteagle]$ ls
2.txt 3.txt
[younggirl@centos7 /neteagle]$ rm -f 2.txt #无法删除文件,因为没有w权限。
rm: cannot remove ‘2.txt’: Permission denied
12.3.3.2 测试neteagle目录权限中x和w与r的配合,以及r和w与x的配合
将文件的权限和用户及组调整为如下属性:
[root@centos7 ~]# chmod 736 /neteagle/ #读者原样输入即可,12.4.1节会详细讲解,这里无须关心为什么如此输入。
[root@centos7 ~]# chown neteagle.incahome /neteagle/ #修改用户及组。
[root@centos7 ~]# ll -d /neteagle/
drwx-wxrw-. 2 neteagle incahome 32 Oct 15 20:33 /neteagle/
根据修改后的目录属性信息可知, /neteagle目录的所属的用户及组分别为neteagle用户和incahome组,因此,neteagle用户对/neteagle目录的权限看前三位(rwx),而younggirl用户属于incahome组,因此,younggirl用户对/neteagle目录的权限看中三位(-wx),最后test用户对/neteagle目录的权限看最后三位(rw-)。
实践步骤如下。
下面是使用younggirl用户进行测试的情况。注意这里要看中三位(-wx):
[younggirl@centos7 /neteagle]$ ll -d /neteagle/
drwx-wxrw-. 2 neteagle incahome 32 Oct 15 20:33 /neteagle/ #中三位(-wx)是younggirl对应的权限。
[younggirl@centos7 /neteagle]$ ls /neteagle #无法列表目录下的内容,因为无r权限。
ls: cannot open directory /neteagle: Permission denied
[younggirl@centos7 /neteagle]$ touch /neteagle/m.txt #可以创建文件,因为有w权限。
[younggirl@centos7 /neteagle]$ cd /neteagle/ #可以切换到目录,因为有x权限。
[younggirl@centos7 /neteagle]$ ls
ls: cannot open directory .: Permission denied
[younggirl@centos7 /neteagle]$ rm -f m.txt #可以删除文件,因为具有w权限。
以下是使用test用户进行测试的情况,注意这里要看后三位(rw-):
[test@centos7 ~]$ whoami
test
[test@centos7 ~]$ ll -d /neteagle/
drwx-wxrw-. 2 neteagle incahome 32 Oct 15 20:52 /neteagle/ #后三位(rw-)是test用户对应的权限。
[test@centos7 ~]$ ls /neteagle/ #可以列表目录下的内容,因为具有r权限。
ls: cannot access /neteagle/2.txt: Permission denied #但是缺少x权限配合,所以,报错了。
ls: cannot access /neteagle/3.txt: Permission denied
2.txt 3.txt #依然可以看到目录下的内容。
[test@centos7 ~]$ ll /neteagle/ #可以列表目录下的内容的属性信息。
ls: cannot access /neteagle/2.txt: Permission denied
ls: cannot access /neteagle/3.txt: Permission denied
total 0
-????????? ? ? ? ? ? 2.txt #属性信息为多个问号属于不正常现象,因为缺少x权限配合。
-????????? ? ? ? ? ? 3.txt
[test@centos7 ~]$ touch /neteagle/n.txt #无法创建文件,虽然有w,但是没有x权限配合。
touch: cannot touch ‘/neteagle/n.txt’: Permission denied
[test@centos7 ~]$ rm -f /neteagle/3.txt #无法删除文件,虽然有w,但是没有x权限配合。
rm: cannot remove ‘/neteagle/3.txt’: Permission denied
[test@centos7 ~]$ cd /neteagle #无法进入目录,因为没有x权限配合。
-bash: cd: /neteagle: Permission denied
测试结论:
- 对于目录,r权限表示可以浏览目录下的内容(ls以及ls -l),w权限表示可以删除目录的文件,以及在目录下创建文件,x权限表示切换到目录下。
- 没有x权限配合,即使有w权限也无法删除和创建文件。
- 没有x权限的配合,即使有r权限,在查看目录内容及目录下的内容属性时也会报错或者显示问号,但依然可以看到列表的文件名。
【1】请读者特别注意自己是在什么用户窗口下进行测试的,否则,可能会出现不一样的结果。