适用:所有 Linux 耗时:约 25 分钟 前置:第一季 D6(会基本命令)

权限是 Linux 里最让人犯怵的一块,但它其实只有三个问题:

  1. 谁能动(三个身份)
  2. 能动什么(三种动作)
  3. 怎么表示(字母 / 数字)

把这三个问题理顺,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字符设备 / 块设备(硬盘、终端等)
ssocket(进程间通信用)

你 99% 只会看到 - 和 d。


二、三个身份 × 三种动作

三个身份

符号名字是谁
uuser / owner文件的主人
ggroup主人所在的组
oothers其他所有人

三种动作

符号对文件对目录(重点,不一样)
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

常用组合速查

数字符号典型用途
755rwxr-xr-x目录、可执行程序(最常见)
644rw-r--r--普通文件(最常见)
700rwx------私有目录(只有自己能进)
600rw-------私有文件(比如 SSH 私钥、密码文件)
777rwxrwxrwx⚠️ 谁都能改,几乎从不该用
750rwxr-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,先问三个问题:

  1. 是谁在被拒绝?(看报错里的用户)
  2. 他需要什么动作?(读 / 写 / 执行)
  3. 最小给到什么程度够用?

给最小的那个,不是最大的那个。

真正的原则叫「最小权限」:只给完成工作所必需的那一点,多一点都不给。


六、三个特殊权限位(了解即可)

ls -l 有时会出现 rws 或者 rwxrwxrwt 这种带字母的:

位符号位置作用
SUIDs(属主位)rws------执行时以属主身份运行(passwd 命令靠它改密码)
SGIDs(组位)---rws---执行时以属组身份;目录上则新建文件自动继承该组
Stickyt(其他人位)------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:把数字翻译成符号(不动手,心里过一遍)

数字符号谁能干什么
644rw-r--r--自己读写;组和其他人只读
755rwxr-xr-x自己全权;组和其他人能读能进
640rw-r-----自己读写;组只读;其他人啥也没有
700rwx------只有自己能进能改
444r--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|进程与服务:软件为什么不启动