Skip to content

Linux 文件权限

1. 为什么 Linux 有文件权限

Linux 是一个多用户系统。

同一台 Linux 设备上可以存在多个用户,因此系统需要控制:

  • 谁可以读取文件
  • 谁可以修改文件
  • 谁可以执行文件
  • 谁可以访问目录

Linux 最基础的权限模型包含三类用户:

text
user
group
others

也就是:

text
文件所有者
所属用户组
其他用户

2. 查看文件权限

使用:

bash
ls -l

例如:

text
-rw-r--r-- 1 moonlit moonlit 1250 Aug 26 20:30 test.txt

其中最前面的:

text
-rw-r--r--

就是文件权限。

后面的:

text
moonlit moonlit

分别表示:

text
文件所有者
所属用户组

3. 权限字符串怎么看

例如:

text
-rwxr-xr--

一共有 10 个字符。

可以拆成:

text
- | rwx | r-x | r--

含义分别是:

text
文件类型 | 所有者权限 | 用户组权限 | 其他用户权限

所以:

text
-rwxr-xr--

表示:

  • 所有者:可读、可写、可执行
  • 用户组:可读、可执行
  • 其他用户:只读

4. 第一个字符表示文件类型

权限字符串的第一个字符不是权限,而是文件类型。

常见类型:

字符含义
-普通文件
d目录
l符号链接
c字符设备
b块设备

例如:

text
-rw-r--r--

开头是:

text
-

说明这是普通文件。

而:

text
drwxr-xr-x

开头是:

text
d

说明这是目录。


5. rwx

Linux 最基本的权限有三个:

text
r
w
x

分别代表:

text
read
write
execute

即:

权限含义
r读取
w写入
x执行

如果没有某项权限,会显示:

text
-

例如:

text
r--

表示:

text
只有读取权限

6. 文件的 rwx

对于普通文件:

r

读取文件内容。

例如:

bash
cat test.txt

需要读取权限。

w

修改文件内容。

例如使用编辑器:

bash
nvim test.txt

要保存修改通常需要写权限。

x

执行文件。

例如:

bash
./script.sh

通常要求文件拥有执行权限。


7. 目录的 rwx

目录的权限和普通文件稍有不同。

r

允许查看目录中的文件名。

例如:

bash
ls test/

w

允许在目录中:

text
创建文件
删除文件
重命名文件

x

允许进入目录,以及访问目录内部的文件。

例如:

bash
cd test

需要目录拥有执行权限。

因此对目录来说:

text
x

非常重要。


8. 所有者、用户组和其他用户

例如:

text
-rwxr-xr--

拆开:

text
rwx | r-x | r--

分别对应:

text
user   group   others

也可以简写成:

text
u
g
o

含义:

字母含义
uuser,文件所有者
ggroup,文件所属组
oothers,其他用户
aall,所有用户

9. 查看当前用户

使用:

bash
whoami

例如:

text
moonlit

表示当前登录用户是:

text
moonlit

10. 查看用户所属组

使用:

bash
groups

或者:

bash
id

例如:

bash
id

可能输出:

text
uid=1000(moonlit) gid=1000(moonlit) groups=1000(moonlit),27(sudo)

可以查看:

text
用户 ID
主组 ID
所属用户组

11. chmod

修改文件权限使用:

bash
chmod

chmod 是:

text
change mode

的缩写。

Linux 中主要有两种常见权限修改方式:

text
符号方式
数字方式

12. 使用符号方式修改权限

基本格式:

bash
chmod 用户 操作 权限 文件

例如:

bash
chmod u+x script.sh

表示:

text
给文件所有者增加执行权限

其中:

text
u    user
+    增加
x    execute

13. +-=

修改权限时常见操作符:

符号含义
+增加权限
-删除权限
=直接设置权限

例如:

bash
chmod u+x script.sh

增加执行权限。

bash
chmod u-x script.sh

删除执行权限。

bash
chmod u=rw test.txt

将所有者权限设置为:

text
rw-

14. 给所有用户增加执行权限

bash
chmod a+x script.sh

其中:

text
a

表示:

text
all

也就是:

text
user
group
others

全部增加执行权限。


15. 同时修改多类用户权限

例如:

bash
chmod u+x,g+x script.sh

表示:

text
所有者增加执行权限
用户组增加执行权限

也可以:

bash
chmod ug+x script.sh

效果类似。


16. 数字权限

Linux 中更常见的一种方式是数字权限。

三个权限对应数字:

text
r = 4
w = 2
x = 1

组合权限时,把数字相加。

例如:

text
rwx

等于:

text
4 + 2 + 1 = 7

所以:

text
rwx = 7

17. 常见数字组合

权限数字
---0
--x1
-w-2
-wx3
r--4
r-x5
rw-6
rwx7

最重要的是记住:

text
r = 4
w = 2
x = 1

然后自己相加即可。


18. chmod 755

例如:

bash
chmod 755 script.sh

三个数字分别对应:

text
user
group
others

所以:

text
7 5 5

展开:

text
7 = rwx
5 = r-x
5 = r-x

最终权限:

text
rwxr-xr-x

完整显示可能是:

text
-rwxr-xr-x

19. chmod 644

普通文本文件经常可以看到:

bash
chmod 644 test.txt

解释:

text
6 = rw-
4 = r--
4 = r--

所以:

text
rw-r--r--

含义:

text
所有者:可以读、写
用户组:只能读
其他用户:只能读

20. 常见权限

644

text
rw-r--r--

常见于普通文件。

所有者:

text
读 + 写

其他用户:

text
只读

755

text
rwxr-xr-x

常见于:

text
目录
可执行程序
Shell 脚本

所有者:

text
读 + 写 + 执行

其他用户:

text
读 + 执行

600

text
rw-------

只有文件所有者可以读取和修改。

常用于一些敏感文件。

例如 SSH 私钥通常要求非常严格的权限。


700

text
rwx------

只有文件所有者拥有全部权限。


21. 给 Shell 脚本增加执行权限

假设有:

text
hello.sh

内容:

bash
#!/bin/bash

echo "Hello Linux"

查看权限:

bash
ls -l hello.sh

可能是:

text
-rw-r--r-- hello.sh

此时没有:

text
x

执行:

bash
chmod +x hello.sh

再次查看:

bash
ls -l hello.sh

可能变成:

text
-rwxr-xr-x hello.sh

然后:

bash
./hello.sh

即可执行。


22. ./ 和执行权限

假设当前目录中有:

text
hello.sh

执行:

bash
./hello.sh

这里:

text
.

表示当前目录。

所以:

text
./hello.sh

意思是:

text
执行当前目录里的 hello.sh

如果文件没有执行权限,可能看到:

text
Permission denied

这时可以检查:

bash
ls -l hello.sh

23. chown

修改文件所有者使用:

bash
chown

例如:

bash
sudo chown moonlit test.txt

表示把:

text
test.txt

的所有者修改为:

text
moonlit

通常修改其他用户拥有的文件需要管理员权限。


24. 同时修改所有者和用户组

格式:

bash
sudo chown 用户:用户组 文件

例如:

bash
sudo chown moonlit:moonlit test.txt

表示:

text
所有者 = moonlit
所属组 = moonlit

25. 修改整个目录

例如:

bash
sudo chown -R moonlit:moonlit project

其中:

text
-R

表示递归。

也就是修改:

text
project

以及目录内部所有文件和子目录。


26. chgrp

只修改文件所属组,可以使用:

bash
chgrp

例如:

bash
sudo chgrp developers test.txt

将:

text
test.txt

所属用户组修改为:

text
developers

27. Permission denied

Linux 中很常见的错误:

text
Permission denied

意思就是:

text
权限不足

例如:

bash
touch /etc/test.txt

普通用户通常没有权限直接修改:

text
/etc

因此可能提示:

text
Permission denied

28. sudo

当命令需要管理员权限时,经常使用:

bash
sudo

例如:

bash
sudo apt update

或者:

bash
sudo nvim /etc/hosts

sudo 可以让当前命令临时以更高权限运行。

但不应该看到权限错误就无脑加:

text
sudo

最好先弄清楚为什么需要管理员权限。


29. 不要随便使用 chmod 777

你可能经常在网上看到:

bash
chmod 777 file

777 表示:

text
rwxrwxrwx

也就是:

text
所有者:读写执行
用户组:读写执行
其他用户:读写执行

所有人都有全部权限。

虽然这样可能快速解决:

text
Permission denied

但往往会带来安全问题。

因此:

text
chmod 777

不应该作为通用的权限修复方法。


30. 目录权限示例

假设:

bash
ls -ld project

输出:

text
drwxr-xr-x

拆开:

text
d | rwx | r-x | r-x

说明:

text
d

这是目录。

所有者:

text
rwx

可以:

text
查看目录内容
创建和删除文件
进入目录

用户组和其他用户:

text
r-x

可以:

text
查看目录
进入目录

但不能在里面创建或删除文件。


31. 文件权限和目录权限不要混淆

例如:

text
-rw-r--r--

对于文件来说很正常。

但是如果目录只有:

text
drw-r--r--

没有:

text
x

即使拥有读取权限,也可能无法正常:

bash
cd directory

因为目录的:

text
x

代表:

text
进入和访问目录内部内容

32. 默认权限和 umask

创建文件时,Linux 会根据默认规则和:

text
umask

决定最终权限。

查看当前:

bash
umask

常见输出:

text
0022

一般情况下:

text
新文件

常见默认权限:

text
644

新目录常见:

text
755

具体结果会受到当前系统和 umask 设置影响。


33. 为什么文件默认没有 x

普通新建文件通常不会默认带执行权限。

例如:

bash
touch test.sh

查看:

bash
ls -l test.sh

可能是:

text
-rw-r--r--

即使扩展名是:

text
.sh

也不会自动拥有执行权限。

需要手动:

bash
chmod +x test.sh

Linux 判断文件是否可以直接执行,主要看:

text
执行权限

而不是只看扩展名。


34. 查看某个目录的权限

使用:

bash
ls -ld 目录

例如:

bash
ls -ld ~/.ssh

注意:

bash
ls -l ~/.ssh

主要列出目录里面的文件。

而:

bash
ls -ld ~/.ssh

查看的是:

text
.ssh 目录本身

35. 递归修改权限

可以使用:

bash
chmod -R

例如:

bash
chmod -R 755 project

表示递归修改:

text
project

内部全部文件和目录。

但这种方式要谨慎。

因为:

text
文件
目录

通常并不应该使用完全相同的权限。

例如普通文本文件通常没有必要拥有执行权限。


36. 一个完整示例

创建脚本:

bash
touch hello.sh

查看:

bash
ls -l hello.sh

可能得到:

text
-rw-r--r--

此时权限是:

text
所有者:rw-
用户组:r--
其他人:r--

增加执行权限:

bash
chmod u+x hello.sh

再次查看:

bash
ls -l hello.sh

变成:

text
-rwxr--r--

如果执行:

bash
chmod 755 hello.sh

则变为:

text
-rwxr-xr-x

37. 权限数字速记

只需要记住:

text
r = 4
w = 2
x = 1

所以:

text
7 = 4 + 2 + 1 = rwx
6 = 4 + 2     = rw-
5 = 4 + 1     = r-x
4 = 4         = r--

最常见:

text
755 = rwxr-xr-x
644 = rw-r--r--
700 = rwx------
600 = rw-------

38. 常用命令速查

命令作用
ls -l查看文件权限
ls -ld查看目录本身权限
chmod修改权限
chown修改所有者
chgrp修改所属组
whoami查看当前用户
groups查看所属用户组
id查看用户和用户组信息
umask查看默认权限掩码
sudo临时以管理员权限执行命令

小结

Linux 权限最核心的结构是:

text
rwx rwx rwx
 ↑   ↑   ↑
用户 用户组 其他用户

三个权限:

text
r = read    = 读取 = 4
w = write   = 写入 = 2
x = execute = 执行 = 1

看到:

text
-rwxr-xr--

就拆成:

text
-   rwx   r-x   r--
│    │     │     │
│    │     │     └── 其他用户
│    │     └──────── 用户组
│    └────────────── 所有者
└─────────────────── 文件类型

入门阶段重点掌握:

bash
ls -l
chmod +x file
chmod 755 file
chmod 644 file
chown user file

以及理解:

text
755
644
rwx
user / group / others

基本就能应对日常 Linux 文件权限问题。