适用:所有 Linux 耗时:约 25 分钟 前置:第一季 D6(会基本命令)
权限是 Linux 里最让人犯怵的一块,但它其实只有三个问题:
- 谁能动(三个身份)
- 能动什么(三种动作)
- 怎么表示(字母 / 数字)
把这三个问题理顺,755 这种数字就不再是咒语。
一、先看一行 ls -l
ls -l
输出长这样:
-rw-r--r-- 1 zhangsan zhangsan 4096 10月 20 12:00 report.txt
drwxr-xr-x 2 zhangsan zhangsan 4096 10月 20 11:00 文档
第一列 -rw-r--r-- 和 drwxr-xr-x 就是权限,一共 10 个字符,分成四段:
- rw- r-- r--
│ │ │ └── 其他人(o = others)
│ │ └─────────── 所属组(g = group)
│ └──────────────────── 属主(u = user / owner)
└───────────────────────────── 文件类型
文件类型那一格(最左边一个字符):
| 字符 | 意思 |
|---|---|
- | 普通文件 |
d | 目录 |
l | 符号链接(快捷方式) |
c / b | 字符设备 / 块设备(硬盘、终端等) |
s | socket(进程间通信用) |
你 99% 只会看到 - 和 d。
二、三个身份 × 三种动作
三个身份
| 符号 | 名字 | 是谁 |
|---|---|---|
u | user / owner | 文件的主人 |
g | group | 主人所在的组 |
o | others | 其他所有人 |
三种动作
| 符号 | 对文件 | 对目录(重点,不一样) |
|---|---|---|
r 读 | 能看内容 | 能列出里面有什么(ls) |
w 写 | 能改内容 | 能在里面增删文件(touch/rm) |
x 执行 | 能运行它 | 能进去(cd) |
这是最容易搞混的地方:目录的
r不是"读目录内容",是"能看见里面有哪些名字";目录的x是"能进入/穿过"。
举个真实场景:一个目录权限是 r--(有读没执行),你能 ls 看见文件名,但 cd 进不去、也打不开里面的文件。这个状态很奇怪但确实存在。
三、数字表示法:755 是怎么来的
每个动作对应一个数字:
r = 4
w = 2
x = 1
没权限 = 0
每组的数字 = 这一组有哪几个动作相加:
rwx = 4+2+1 = 7
rw- = 4+2+0 = 6
r-x = 4+0+1 = 5
r-- = 4+0+0 = 4
--- = 0+0+0 = 0
三组拼起来就是三位数:
7 5 5
│ │ └── others: r-x (4+1)
│ └──── group: r-x (4+1)
└────── owner: rwx (4+2+1)
rwxr-xr-x = 755
常用组合速查
| 数字 | 符号 | 典型用途 |
|---|---|---|
| 755 | rwxr-xr-x | 目录、可执行程序(最常见) |
| 644 | rw-r--r-- | 普通文件(最常见) |
| 700 | rwx------ | 私有目录(只有自己能进) |
| 600 | rw------- | 私有文件(比如 SSH 私钥、密码文件) |
| 777 | rwxrwxrwx | ⚠️ 谁都能改,几乎从不该用 |
| 750 | rwxr-x--- | 组内共享的目录 |
记两个就够日常:
- 文件 → 644
- 目录 / 程序 → 755
四、改权限:chmod
数字法(推荐,一次到位)
chmod 644 report.txt # 文件:自己读写,别人只读
chmod 755 myscript.sh # 脚本:自己能改能跑,别人能跑
chmod 700 ~/.ssh # 私钥目录:只有自己能进
chmod -R 755 网站目录/ # -R 递归,整个目录树都改
字母法(改单项,更精确)
chmod u+x myscript.sh # 给属主加执行权限
chmod g-w report.txt # 去掉组的写权限
chmod o=r report.txt # 把其他人的权限设成只读(= 是覆盖)
chmod a+r report.txt # a = all,所有人加读
区别:
+/-= 在原有基础上加减== 直接设成这个值
改所有者:chown
sudo chown zhangsan report.txt # 改属主
sudo chown zhangsan:developers report.txt # 同时改属主和组
sudo chown -R www-data:www-data /var/www/site # 网站目录常用
改所属组:chgrp
sudo chgrp developers report.txt
五、为什么「一律 777」是灾难
新手遇到"Permission denied",第一反应是 chmod 777。这是坏习惯,而且是安全问题。
777 = 任何人都能读、写、执行。
后果:
| 场景 | 777 之后会发生什么 |
|---|---|
| 网站目录 | 任何被攻破的进程都能往你网站里写文件,包括写一个后门 |
| 脚本文件 | 别人能改脚本内容,你一跑就执行了他的代码 |
| 配置文件 | 别人能改你的配置 |
| SSH 私钥 | 私钥泄露,服务器直接归别人 |
正确做法:遇到 Permission denied,先问三个问题:
- 是谁在被拒绝?(看报错里的用户)
- 他需要什么动作?(读 / 写 / 执行)
- 最小给到什么程度够用?
给最小的那个,不是最大的那个。
真正的原则叫「最小权限」:只给完成工作所必需的那一点,多一点都不给。
六、三个特殊权限位(了解即可)
ls -l 有时会出现 rws 或者 rwxrwxrwt 这种带字母的:
| 位 | 符号 | 位置 | 作用 |
|---|---|---|---|
| SUID | s(属主位) | rws------ | 执行时以属主身份运行(passwd 命令靠它改密码) |
| SGID | s(组位) | ---rws--- | 执行时以属组身份;目录上则新建文件自动继承该组 |
| Sticky | t(其他人位) | ------rwt | 目录里只有文件主人能删自己的文件(/tmp 就是这个) |
数字写法:SUID=4,SGID=2,Sticky=1,加在三位数前面,变成四位数。
chmod 4755 program # SUID
chmod 2775 shared_dir # SGID
chmod 1777 /tmp # Sticky(这就是 /tmp 的真实权限)
日常你不需要主动设 SUID/SGID。 但看到别人设了,要保持警惕——尤其是有 SUID 的可执行文件,是提权攻击的常见目标。
七、动手:三个练习
练习 1:造一个文件,观察权限变化
cd ~
touch demo.txt
ls -l demo.txt # 默认应该是 -rw-r--r--(644)
chmod 600 demo.txt
ls -l demo.txt # 变成 -rw-------
chmod u+x demo.txt
ls -l demo.txt # 变成 -rwx------
练习 2:把数字翻译成符号(不动手,心里过一遍)
| 数字 | 符号 | 谁能干什么 |
|---|---|---|
| 644 | rw-r--r-- | 自己读写;组和其他人只读 |
| 755 | rwxr-xr-x | 自己全权;组和其他人能读能进 |
| 640 | rw-r----- | 自己读写;组只读;其他人啥也没有 |
| 700 | rwx------ | 只有自己能进能改 |
| 444 | r--r--r-- | 所有人只读,谁都改不了(包括自己) |
练习 3:制造一次 Permission denied,然后正确修好
mkdir ~/testdir
echo "hello" > ~/testdir/a.txt
chmod 000 ~/testdir/a.txt
cat ~/testdir/a.txt # 报 Permission denied(连自己都读不了)
ls -l ~/testdir/a.txt # 看权限:----------
chmod 644 ~/testdir/a.txt # ✅ 给回正常权限
cat ~/testdir/a.txt # hello
注意:
chmod 000之后连你自己都读不了(root 除外)。这不是 bug,是权限在起作用。
八、验证:你过关了吗
- 看
ls -l能说出-rw-r--r--每一段是什么意思 - 能把
755/644/600翻译成符号,反过来也行 - 知道目录的
x是"能进去",w是"能增删文件" - 会用
chmod的数字法和字母法 - 会用
chown改属主 - 能说清为什么不该用
chmod 777
九、不行怎么办
Q1:chmod 报 Operation not permitted
文件不是你的,或者你在改系统文件。加 sudo:
sudo chmod 644 /etc/某文件
Q2:chmod +x 了脚本还是不能跑
两种可能:
# ① 没加 ./
./myscript.sh # 必须加 ./,否则系统去 PATH 里找
# ② 脚本第一行缺 shebang
head -1 myscript.sh # 应该是 #!/bin/bash
Q3:sudo 都改不了权限
如果是 chattr +i(不可变属性)锁住的:
lsattr 文件 # 看有没有 i 标记
sudo chattr -i 文件 # 解锁
Q4:改了权限,程序还是报 Permission denied
可能是上级目录没权限。x 是逐层继承的——你要访问 /a/b/c.txt,必须对 /a、/a/b、/a/b/c.txt 每一层都有 x:
namei -l /a/b/c.txt # 一次看清每一层的权限,非常好用
Q5:网站目录 403 Forbidden 最常见是属主不对:
sudo chown -R www-data:www-data /var/www/site
sudo chmod -R 755 /var/www/site
别用 777 解决 403——那是拿安全换省事。
十、一句话总结
权限 = 三个身份 × 三种动作 × 两种表示法。
日常就记:文件 644,目录/程序 755,私有 600/700,永远别 777。
← 返回 7 天进阶清单 下一篇 → E2|进程与服务:软件为什么不启动