这一篇文章主要是想给大家将明白Linux的目录和文件的权限的概念,还有我们经常设置目录或者权限的时候。使用的777或者755啊。这些数字是什么意思。希望通过这篇文章的解释,可以让大家明白这其中的原理。
文件属性
首先,我们想搞清楚文件属性。我们在linux操作系统中随便一个地址执行ls -la
。这是列出当前目录详细列表的。
1
2
3
4
5
root@php-7.3.24 in /test $ ll
total 8
drwxr-xr-x 2 root root 4096 Jun 15 13:46 ./
drwxr-xr-x 1 root root 4096 Jun 15 13:46 ../
-rw-r--r-- 1 root root 0 Jun 15 13:46 test
你得到的可能是上面这些东西。
上面这些数字分别代表的是什么意思啦?
我们一块一块来讲解
- 第一部分
这里表示的当前这个文件或者是目录的权限。它是由10个字符组成。
分别是1+3+3+3
第一个字符代表的是这个是文件还是目录还是链接等等的信息。
我们通常可以看到这几种结果
d:表示这是一个目录
-:表示这是一个文件
l:表示这是一个链接
还有b和c两种。我很少见过,所以不说。感兴趣的同学可以去查一下。
后面9个字符代表着权限,每三个为一组。分别是3组。
第一组表示的是所属用户的权限,第二组表示所属组的权限,第三组表示其他用户的权限。
每组的三个字母分别是如下:
r:代表着可读。用数字4表示
w:代表着可写。用数字2表示
x:代表着可执行。用数字1表示
三个数字加起来最大也就是7了
例如。我想给test文件的其他用户设置权限为,可读(4)可写(2)。那就是6的权限。
我们可以执行命令
chmod o+rw test
这样就可以设置test文件的可读可写了
以上test文件如果用数字表示的话。它就是646
- 第二部分
表示什么连接数。我也不是很懂,不忽悠人。
- 第三部分
表示当前文件的所属用户
- 第四部分
表示当前文件的所属组
- 第五部分
文件大小,默认单位为bytes
- 第六部分
文件的最后修改日期
- 第七部分
文件名或者是目录名
实操
- 添加一个文件a。设置其所属用户有可读可写可执行的权限。所属组有可读可执行的权限。其他用户只有读取的权限。
1
2
3
4
5
# 创建文件a
touch a
# 设置权限
chmod 754 a
用户和用户组
刚才的实操,我们还没有验证它的准确性啊。我们先来将一个用户和用户组。
刚才已经讲过,每个文件都有所属用户和所属组。并且设置了相对应的权限。
为了方便后面的讲解和演示,我们先创建几个用户
1
2
3
4
5
6
7
8
9
# 创建www用户组
groupadd www
# 创建两个www用户
useradd www01 -g www
useradd www02 -g www
# 创建一个其他用户
useradd test
开始下面的一波操作猛如虎。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# 当前是处于root用户。创建一个/test的文件夹
mkdir /test
# 设置/test目录为777权限
chmod 777 /test
# 为什么要给777的权限,因为下面要使用www01在此目录新建文件。当前目录对于www01来说就是其他用户了。所以必须给其他用户可写可读可执行的权限。
# 切换至www01用户,并且到/test目录
su www
cd /test
# 新建www01文件。写入一个echo
echo "echo 'www01'" > www01
# 设置文件所属用户可读可写可执行,所属组可读可执行,其他用户可读
chmod 754 www01
# 当前用户执行
./www01
# 成功输出www01
#退回root用户
exit
# 切换www02用户
su www02
cd /test
# 验证是否可执行
./www01
#成功输出
# 验证是否可写
echo '123' > www01
# 报错了,说你没权限
# cannot create www01: Permission denied
# 切换到其他用户
exit
su test
cd /test
# 验证可读
cat www01
# 成功输出
# 验证可写
echo '123' > www01
# 可写失败
# 验证可执行
./www01
# 执行失败
补充说明
文件的所属用户其实真是的表示方式是用用户的id和组的id来表示的。只是在当前这些文件都是我们自己创建的。所以linux能找到对应的id的对应用户名称。有时候在将目录挂在到docker里面去或者是在使用nas的时候。我们就会发现。如果A服务器写入文件是用www用户写入的并且uid是1000。那么如果在B服务器没有uid为1000的用户。在执行ls -la
的时候,你就只能看到数字1000了。不能看到对应的用户了。