Linux 权限管理

Linux 是多用户系统,从设计第一天就考虑了"谁能做什么"。每个文件都有权限位:谁能读、谁能写、谁能执行。这看似麻烦,其实是 Linux 安全的基础——也是新手最容易卡住的点。这一篇我们把它一次讲透。

1. 先读懂 ls -l 的输出

上一篇我们见过 ls -l,但跳过了最左边的 10 个字符。现在正式认识它:

# 读懂 ls -l 的权限位
ls -l deploy.sh
# -rwxr-xr-- 1 aden staff 84K Aug 4 18:30 deploy.sh

# 第一个字符:文件类型(- 普通文件 / d 目录 / l 软链接)
# 接下来 9 位分 3 组,每组 3 位 rwx:
#   rwx     r-x     r--
#   所有者  同组    其他人
#   (user)  (group) (other)
#
#   r = read    读(4)
#   w = write   写(2)
#   x = execute 执行(1)
#   - 表示没有该权限

# 所以上面 deploy.sh 的权限是:
#   所有者:读+写+执行(rwx = 7)
#   同组:  读+执行(r-x = 5)
#   其他人:只读(r-- = 4)
#   合起来写成数字:754

关键在中间 9 位:分成所有者(user)同组(group)其他人(other)三组,每组三位 rwxr 读、w 写、x 执行。对目录来说,x 表示"能否进入这个目录(cd 进去)",r 表示"能否列出目录内容"。

2. 权限的数字表示

三位 rwx 对应三个数字,加起来就是这一组的权限总分:

例如 rwx = 4+2+1 = 7,r-x = 4+1 = 5,rw- = 4+2 = 6。三组合起来就是常见的三位数,比如 755 = rwxr-xr-x。

3. chmod:修改权限

chmod 是 "change mode" 的缩写。修改权限有两种写法:数字法(最常用)和符号法(适合微调)。

先看数字法,记忆两个最常用的组合就够了:

# chmod:change mode,修改权限

# 数字法(最常用,先记这个)
# 每位权限对应一个数字:r=4 w=2 x=1,加起来就是该组的权限
#   7 = 4+2+1 = rwx
#   6 = 4+2   = rw-
#   5 = 4+1   = r-x
#   4 = 4     = r--
#   0 = 无任何权限

chmod 755 deploy.sh        # rwxr-xr-x(脚本/目录最常用)
chmod 644 notes.txt        # rw-r--r--(普通文件默认)
chmod 600 id_rsa           # rw-------(私钥,只能自己读)
chmod 777 public/          # rwxrwxrwx(所有人可读写执行,危险,慎用)
chmod 700 ~/.ssh           # rwx------(SSH 目录标准权限)

# 计算示例:想让所有者全权限、同组只读、其他人无任何权限
#   所有者 rwx = 7
#   同组   r-- = 4
#   其他人 --- = 0
#   => chmod 740 file

新手记住两个数字:755(可执行文件、目录)、644(普通文件)。还有一个 600 用于私钥等敏感文件。再来符号法:

# 符号法:用 u/g/o/a + +/-/= + r/w/x 表达
#   u=user(所有者) g=group(同组) o=other(其他人) a=all(全部)
#   + 加权限  - 减权限  = 设成精确值

chmod u+x deploy.sh        # 给所有者加执行权限
chmod g+w notes.txt        # 给同组加写权限
chmod o-r secret.txt       # 移除其他人的读权限
chmod a+x script.sh        # 所有人加执行权限(等于 chmod +x)
chmod u=rwx,g=rx,o= file  # 设成精确值 rwxr-x---
chmod +x script.sh         # 最常见:所有人加执行(让脚本能跑)

# 递归修改整个目录
chmod -R 755 myproject     # -R:recursive,目录和里面所有文件都改

符号法的好处是"加加减减"不用算数字:chmod +x script.sh(给所有人加执行权限)是日常最高频的操作——下载一个脚本想运行它,几乎都要先 chmod +x

4. chown:修改所有者

chown 是 "change owner" 的缩写。权限是相对于"所有者"的,所以"谁是所有者"本身也能改:

# chown:change owner,修改文件的所有者和所属组
# 用法:chown 用户:组 文件

sudo chown alice file.txt          # 只改所有者为 alice
sudo chown alice:dev file.txt      # 改所有者为 alice,组为 dev
sudo chown :dev file.txt           # 只改组为 dev
sudo chown -R aden:staff myproject # -R 递归改整个目录

# chgrp:只改组(chown 的子集,基本用 chown 就够)
sudo chgrp docker socket.sock

# 改所有者通常要 sudo,因为你不能把文件随便送给别人
# 典型场景:把 root 拥有的网站目录改给 deploy 用户
sudo chown -R deploy:deploy /var/www/mysite

改所有者通常需要 sudo,因为你不能擅自把文件"送给"别人。运维中最常见的场景:把 root 创建的网站目录交给 deploy 用户管理。

5. sudo:临时提权

sudo 是 "super user do" 的缩写,让你以单条命令为单位临时以管理员身份执行。这是日常运维最常用的提权方式:

# sudo:super user do,以管理员身份执行单条命令
sudo apt update              # 临时以 root 身份运行 apt
sudo systemctl restart nginx # 重启 nginx 服务
sudo -i                      # 进入 root 交互式 shell(危险,用完 exit)
sudo su -                    # 切换到 root 用户(老写法)

# sudo 的特点:
#   1. 用你的账号密码,不是 root 密码(便于审计)
#   2. 默认 5 分钟内再 sudo 不用重输密码
#   3. 哪些用户能用 sudo,在 /etc/sudoers 里配置
#   4. 永远用完整路径,如 sudo /usr/bin/apt(SUDO PATH 可能不同)

# 何时需要 sudo?
#   - 改 /etc、/var、/usr 等系统目录
#   - 装软件、启停服务
#   - 改不属于自己的文件
# 不需要 sudo 的:自己主目录下的一切操作

几个安全建议:

6. umask:默认权限是怎么来的

你可能会好奇:为什么 touch 创建的文件是 644、mkdir 创建的目录是 755?这是 umask 决定的:

# umask:决定新建文件的默认权限(反过来算)

# 默认权限 = 满权限 - umask
#   文件满权限 666 (rw-rw-rw-)
#   目录满权限 777 (rwxrwxrwx)

umask                       # 查看当前 umask(常见 022)
# 0022

# umask 022 时,新建文件 = 666 - 022 = 644 (rw-r--r--)
#                  新建目录 = 777 - 022 = 755 (rwxr-xr-x)

umask 077                   # 临时改:新文件只有自己能读
mkdir secret                # 这个目录权限是 700
touch secret.txt            # 这个文件权限是 600

# 注意:umask 是"掩码",减的时候执行位对文件不会自动加
# (出于安全,新建文件默认没有执行权限)

把 umask 写进 ~/.bashrc 可以永久改变默认权限。但日常 022 已经够用,不用动。

7. 三个特殊权限位(进阶)

除了 rwx,还有三个特殊位,看到时不至于发懵即可:

所以 /tmp 的权限通常是 1777(drwxrwxrwt),最后那个 t 就是 sticky。

8. 实战:配置 SSH 密钥的权限

SSH 对权限要求极其严格——权限太开放会直接拒绝工作。这是一个经典的权限练习场景:

排错时第一反应就是 ls -l 看权限对不对。

小结

这一篇你掌握了 Linux 权限模型:读懂 ls -l 的 rwx、用 chmod 数字法和符号法改权限、用 chown 改所有者、用 sudo 提权。权限是 Linux 安全的根基,也是部署、SSH、Docker 卷挂载等场景里高频踩坑的地方。下一篇我们讲文本处理三剑客——grep、sed、awk。

← 上一篇 Linux 文件操作

下一篇 Linux 文本处理

✈️💬