linux目录权限

linux中,外物皆文件。但是这些文件的权限到底是什么鬼

Posted by 张晨 on June 15, 2021

这一篇文章主要是想给大家将明白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了。不能看到对应的用户了。

参考链接