权限管理
一、先学会看权限
执行 ls -l,第一列就是权限信息:
ls -l
-rwxr-xr-x 1 root root 4096 Oct 17 10:00 deploy.sh
drwxr-xr-x 2 root root 4096 Oct 17 10:00 html
这一列 -rwxr-xr-x 拆开看,共 10 位:
- rwx r-x r-x
│ │ │ └── 其他人(o, other)
│ │ └─────── 属组(g, group)
│ └──────────── 属主(u, user)
└──────────────── 文件类型
第一位是类型:- 普通文件,d 目录,l 软链接。
后面 9 位每 3 位一组,分别对应属主、属组、其他人,每组里的 rwx 含义:
| 字母 | 含义 | 数字 |
|---|---|---|
r | read,读 | 4 |
w | write,写 | 2 |
x | execute,执行 | 1 |
- | 没有该权限 | 0 |
所以 -rwxr-xr-x = 属主 rwx(7)、属组 r-x(5)、其他人 r-x(5),即 755。
记法:
r w x三个位置固定,有就是字母,没有就是-,永远不会错位。

二、三个身份与三种权限
Linux 检查文件权限时,通常先判断进程的有效用户 ID 是否匹配文件所有者;如果不匹配,再判断进程是否属于文件的所属组;都不匹配才使用 Other 权限。
重点:r w x 对文件和目录的含义完全不同,这是最容易混的地方:
| 权限 | 对文件 | 对目录 |
|---|---|---|
r | 读取文件内容(cat) | 列出目录里有啥(ls) |
w | 修改文件内容 | 在目录里新建、删除、重命名文件 |
x | 把文件当程序执行(./a.sh) | 进入目录(cd)、访问里面的文件 |
目录必须有
x才能进入。只有r没有x,你能看到文件名,但打不开;只有x没有r,你能cd进去,但ls不出内容。
三、chmod:改权限
两种写法,数字法最常用。
数字法
三位数字依次是属主、属组、其他人,每位 = r(4) + w(2) + x(1):
chmod 755 deploy.sh ## rwxr-xr-x
chmod 644 index.html ## rw-r--r--
chmod 600 id_rsa ## rw-------
chmod 700 ~/.ssh ## rwx------
常用取值对照:
| 值 | 权限 | 典型用途 |
|---|---|---|
755 | rwxr-xr-x | 目录、可执行脚本 |
644 | rw-r--r-- | 普通文件、网页、配置 |
600 | rw------- | 私钥、只给自己看的文件 |
700 | rwx------ | 私有目录(如 ~/.ssh) |
777 | rwxrwxrwx | 尽量别用,谁都能改 |
符号法
适合只改某一类权限:
chmod +x deploy.sh ## 所有人加执行权限
chmod u+x deploy.sh ## 只给属主加执行
chmod g-w file ## 去掉属组的写权限
chmod o=r file ## 其他人设为只读(= 是覆盖)
chmod a+r file ## 所有人加读权限(a = u+g+o)
u属主、g属组、o其他人、a所有人+增加、-移除、=直接设定
-R递归:chmod -R 755 html/。执行前一定确认路径,它会把整棵树都改掉。
四、chown / chgrp:改归属
改属主(所有权),需要 sudo:
sudo chown deploy file.txt ## 只改属主
sudo chown deploy:devops file.txt ## 同时改属主和属组
sudo chown :devops file.txt ## 只改属组
sudo chown -R www-data:www-data /var/www/html ## 递归改整个目录
只改属组也可以用 chgrp:
sudo chgrp devops /data/app
权限(rwx)和归属(谁的文件)是两件事:
chmod决定“能干什么”,chown决定“是谁的”。
-rw-r--r-- 1 alice devops a.txt
└── chmod ──┘ └chown┘└chgrp┘
chown 换“人”,chgrp 换“组”,chmod 换“权限”。
五、umask:新建文件的默认权限
新建文件默认不是 777,会被 umask 减掉一部分:
umask
## 0022
touch a.txt ## 得到 644(666 - 022)
mkdir b ## 得到 755(777 - 022)
默认 umask 022 就是“其他人不能写”,一般不用改。
六、特殊权限(了解即可)
数字法前面多一位,平时很少用:
| 数字 | 名称 | 作用 |
|---|---|---|
4 | setuid | 执行时临时获得属主身份,如 passwd |
2 | setgid | 目录下新建文件自动继承该目录的属组,适合团队共享 |
1 | sticky | 目录里的文件只有本人能删,如 /tmp(1777) |
sudo chmod 2770 /data/app ## 团队共享目录:同组可读写,新建文件自动归组
ls -ld /tmp ## drwxrwxrwt,最后一个 t 就是 sticky
七、常见场景
1. 上传的脚本不能执行
chmod +x deploy.sh
./deploy.sh
2. 部署网站后 403
sudo chown -R www-data:www-data /var/www/html
sudo chmod 755 /var/www/html
sudo find /var/www/html -type f -exec chmod 644 {} \;
3. 保护私钥
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
4. 团队共享目录
sudo groupadd devops
sudo chgrp devops /data/share
sudo chmod 2770 /data/share ## 组内可读写,其他人无权限,新建文件自动归 devops 组
5. 日志只给自己看
chmod 600 app.log
八、避坑要点
- 别用
chmod -R 777,等于把所有文件交给所有人改,是最常见的安全事故。 - 目录缺
x就进不去:设成644的目录一律cd失败,看到 403 先查这个。 -R前确认路径,尤其chmod -R/chown -R,打错一个字符可能改到系统目录。chmod改的是权限,chown改的是归属,两者别混。- root 基本不受权限限制(普通文件的执行位除外),所以
sudo下“改不动”往往不是权限问题,而是文件系统只读或SELinux之类。 - 脚本报
Permission denied,先看ls -l是否有x,再看是否在只读目录里。
脚本执行案例
chains@0xChains:~$ sudo chmod 754 hello.py
chains@0xChains:~$ python3 hello.py
hello Linux!!!
chains@0xChains:~$ ls -l
total 4
-rwxr-xr-- 1 deploy deploy 24 Oct 17 16:05 hello.py
chains@0xChains:~$ groups deploy
deploy : deploy sudo docker devops
chains@0xChains:~$ groups chains
chains : chains adm cdrom sudo dip plugdev users docker
chains@0xChains:~$ ^C
chains@0xChains:~$ ./hello.py
bash: ./hello.py: Permission denied
hello.py文件不属于chains用户,deploy组也不包含chains用户,其他人只能读,为何使用python3还能够运行。
这条命令的能够执行是因为:首先启动了python3解释器,解释器以chains用户的身份读取了hello.py文件,读取内容并且执行。
而直接使用./hello.py 则不行,检查到不属于deploy组也不属于其他所有者,直接拒绝了执行。
九、易错点辨析
这一节是自查用,记录实际练习中最容易混淆的点。
1. 三个命令各改什么
| 命令 | 改什么 | 例子 |
|---|---|---|
chmod | 权限(读、写、执行) | chmod 644 a.txt |
chown | 属主,可顺带改属组 | chown deploy:devops a.txt |
chgrp | 仅属组 | chgrp devops a.txt |
chgrp 不改权限。把文件换到 devops 组后,如果组权限仍是 r--,组员照样只能读,想写还得再 chmod g+w。
2. 匹配即停:属主即使同时也在属组里,也只按属主那 3 位判断,不会把属组权限叠加进来。
3. 目录的 w 只管“目录项”:能不能新建、删除、重命名文件;修改文件内容看文件自身的 w。
4. 目录没有 x 就进不去:里面的文件即使是 777 也访问不了,403 和 Permission denied 优先查这个。
5. 2770 不是“削掉属主和属组的权限”:2 是 setgid,770 表示属主 rwx、属组 rwx、其他人 ---。
6. 770 下“其他人”并非完全看不到:新建文件默认 644、子目录 755(umask 022),组外用户仍可读、可 ls,只是不能写。要彻底隔离,需要配合严格的 umask(如 077)或 ACL。
7. 给单人授权的优先级:改属主 chown > 加入属组 + chmod g+w > 放开 o+w。646 会同时放开所有其他人,通常不是想要的效果。
8. umask 只减不加:文件基准是 666,umask 再小也不会让新文件自动带上执行位。
9. python3 hello.py 能运行、./hello.py 不行:前者只需要对文件有读权限(执行的是 python3 本身),后者要求文件自身带 x。