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. r、w、x
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含义:
| 字母 | 含义 |
|---|---|
u | user,文件所有者 |
g | group,文件所属组 |
o | others,其他用户 |
a | all,所有用户 |
9. 查看当前用户
使用:
bash
whoami例如:
text
moonlit表示当前登录用户是:
text
moonlit10. 查看用户所属组
使用:
bash
groups或者:
bash
id例如:
bash
id可能输出:
text
uid=1000(moonlit) gid=1000(moonlit) groups=1000(moonlit),27(sudo)可以查看:
text
用户 ID
主组 ID
所属用户组11. chmod
修改文件权限使用:
bash
chmodchmod 是:
text
change mode的缩写。
Linux 中主要有两种常见权限修改方式:
text
符号方式
数字方式12. 使用符号方式修改权限
基本格式:
bash
chmod 用户 操作 权限 文件例如:
bash
chmod u+x script.sh表示:
text
给文件所有者增加执行权限其中:
text
u user
+ 增加
x execute13. +、-、=
修改权限时常见操作符:
| 符号 | 含义 |
|---|---|
+ | 增加权限 |
- | 删除权限 |
= | 直接设置权限 |
例如:
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 = 717. 常见数字组合
| 权限 | 数字 |
|---|---|
--- | 0 |
--x | 1 |
-w- | 2 |
-wx | 3 |
r-- | 4 |
r-x | 5 |
rw- | 6 |
rwx | 7 |
最重要的是记住:
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-x19. 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.sh23. 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
所属组 = moonlit25. 修改整个目录
例如:
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
developers27. Permission denied
Linux 中很常见的错误:
text
Permission denied意思就是:
text
权限不足例如:
bash
touch /etc/test.txt普通用户通常没有权限直接修改:
text
/etc因此可能提示:
text
Permission denied28. sudo
当命令需要管理员权限时,经常使用:
bash
sudo例如:
bash
sudo apt update或者:
bash
sudo nvim /etc/hostssudo 可以让当前命令临时以更高权限运行。
但不应该看到权限错误就无脑加:
text
sudo最好先弄清楚为什么需要管理员权限。
29. 不要随便使用 chmod 777
你可能经常在网上看到:
bash
chmod 777 file777 表示:
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.shLinux 判断文件是否可以直接执行,主要看:
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-x37. 权限数字速记
只需要记住:
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 文件权限问题。