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)三组,每组三位 rwx。r 读、w 写、x 执行。对目录来说,x 表示"能否进入这个目录(cd 进去)",r 表示"能否列出目录内容"。
2. 权限的数字表示
三位 rwx 对应三个数字,加起来就是这一组的权限总分:
r= 4w= 2x= 1
例如 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 的:自己主目录下的一切操作几个安全建议:
- 日常不要用 root 登录,需要时才
sudo。 sudo -i进入 root shell 用完立刻exit。- 执行不熟悉的 sudo 命令前,先看懂它做什么。
- 服务器关闭 root 远程登录,只允许普通用户 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,还有三个特殊位,看到时不至于发懵即可:
- SUID(Set User ID):可执行文件运行时,临时以"文件所有者"身份运行。典型例子是
passwd命令——所有者 root,普通用户执行它时能改 /etc/shadow。数字表示为4xxx,符号u+s。 - SGID(Set Group ID):目录上设置后,新建文件继承目录的组而不是创建者的组。团队共享目录常用。数字
2xxx。 - Sticky Bit:目录上设置后,只有文件所有者才能删自己的文件(即使别人有写权限)。典型是
/tmp,大家都能写,但不能互删。数字1xxx。
所以 /tmp 的权限通常是 1777(drwxrwxrwt),最后那个 t 就是 sticky。
8. 实战:配置 SSH 密钥的权限
SSH 对权限要求极其严格——权限太开放会直接拒绝工作。这是一个经典的权限练习场景:
~/.ssh目录必须700~/.ssh/authorized_keys必须600- 私钥
~/.ssh/id_rsa必须600 - 权限不对时 SSH 会报 "Permissions are too open" 拒绝登录
排错时第一反应就是 ls -l 看权限对不对。
小结
这一篇你掌握了 Linux 权限模型:读懂 ls -l 的 rwx、用 chmod 数字法和符号法改权限、用 chown 改所有者、用 sudo 提权。权限是 Linux 安全的根基,也是部署、SSH、Docker 卷挂载等场景里高频踩坑的地方。下一篇我们讲文本处理三剑客——grep、sed、awk。
← 上一篇 Linux 文件操作
下一篇 Linux 文本处理 →