Linux 权限管理
Linux 权限管理
目录
- 权限的基本概念
- 查看权限:ls -l 里的 rwx
- 普通权限修改:chmod
- 修改属主与属组:chown / chgrp
- 目录权限的含义:r/w/x 在目录上的作用
- 特殊权限:setuid / setgid / sticky
- ACL 权限:setfacl / getfacl(进阶)
- 权限掩码:umask 与默认权限
- 不可变属性:chattr(深化)
- 总结与练习
一、权限的基本概念
Linux 是一个多用户系统,通过**权限(Permission)**控制谁能读、写、执行某个文件/目录。
每个文件/目录都有:
- 三种权限:读(r)、写(w)、执行(x)。
- 三类对象:属主(user,u)、属组(group,g)、其他(other,o)。
权限 属主 属组 其他
rwx rwx rwx
│ │ │
│ │ └ 其他用户 other
│ └──────── 属组 group
└────────────── 属主 user
查看文件的所有者信息:
ls -l filename # 查看权限、属主、属组
stat filename # 更详细地查看文件信息(含权限数字表示)
二、查看权限:ls -l 里的 rwx
执行 ls -l 的第一列就是权限字符串,共 10 个字符:
-rwxr-xr-x. 1 root root 1234 ... file
│└┬─┘└┬─┘└┬─┘
│ │ │ │ └── 其他用户(other)的权限
│ │ │ └──── 属组(group)的权限
│ │ └─────── 属主(user)的权限
│ └────────── 第一个字符:文件类型(- 文件,d 目录,l 链接)
└──────────── 第 1 个字符:文件类型
10 个字符的含义:
| 位置 | 含义 |
|---|---|
| 第 1 位 | 文件类型:- 普通文件、d 目录、l 符号链接、b/c 设备 |
| 第 2-4 位 | 属主(user)的 rwx |
| 第 5-7 位 | 属组(group)的 rwx |
| 第 8-10 位 | 其他(other)的 rwx |
r / w / x 分别是什么:
| 权限 | 字母 | 数字 | 含义 |
|---|---|---|---|
| 读 | r | 4 | 读取文件内容 / 列出目录 |
| 写 | w | 2 | 修改文件 / 在目录中增删文件 |
| 执行 | x | 1 | 运行程序 / 进入目录 |
| 无权限 | - | 0 | 无 |
例子:-rwxr-xr-x 表示:
- 属主(u):rwx(读+写+执行)
- 属组(g):r-x(读+执行,无写)
- 其他(o):r-x(读+执行,无写)
注意:
ls -l第一列末尾常有一个.或+:.表示 SELinux 上下文标签(Red Hat 系),+表示存在 ACL(见第七章)。
参考:
man 1 ls、菜鸟教程 - Linux 文件权限
三、普通权限修改:chmod
chmod 用于修改权限,有两种表示法:数字表示法和符号表示法。
3.1 数字表示法(推荐)
把 r=4、w=2、x=1 相加得到一位数字,三类对象各一位:
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
常见组合:
| 数字 | 权限 | 说明 |
|---|---|---|
| 755 | rwxr-xr-x | 属主全权,组和其他只读执行(程序/目录常用) |
| 644 | rw-r--r-- | 属主读写,组和其他只读(普通文件常用) |
| 600 | rw------- | 仅属主可读写(私密文件) |
| 700 | rwx------ | 仅属主全权(私密目录) |
| 777 | rwxrwxrwx | 所有人全权(安全风险高,慎用) |
chmod 755 script.sh # 设置权限为 rwxr-xr-x
chmod 644 file.txt # 设置权限为 rw-r--r--
chmod -R 755 /srv/www # -R 递归修改目录下所有文件
3.2 符号表示法
格式:[对象][操作符][权限]
| 对象 | 含义 | 操作符 | 含义 |
|---|---|---|---|
| u | 属主 | + |
增加权限 |
| g | 属组 | - |
移除权限 |
| o | 其他 | = |
设为(覆盖) |
| a | 所有人(=ugo) |
chmod u+x script.sh # 给属主增加执行权限
chmod g-w file.txt # 移除属组的写权限
chmod o=r file.txt # 其他用户权限设为只读(= 覆盖)
chmod a+r file.txt # 所有人增加读权限
chmod u+rwx,g+rx,o= file # 组合:属主全权,组加 rx,其他无
chmod -R g+w dir/ # 递归给属组加写权限
3.3 数字 vs 符号
- 数字:简洁、一次性设置全部,适合脚本和明确设定。
- 符号:精准增删单项,适合微调。
- 两者可混合理解,掌握数字法最实用。
参考:
man 1 chmod
四、修改属主与属组:chown / chgrp
4.1 chown —— 修改属主(和属组)
sudo chown alice file.txt # 修改属主为 alice
sudo chown alice:dev file.txt # 修改属主为 alice、属组为 dev
sudo chown :dev file.txt # 只修改属组为 dev(前面留空)
sudo chown -R alice:dev dir/ # 递归修改目录及其内容
4.2 chgrp —— 修改属组
chgrp dev file.txt # 修改属组为 dev
chgrp -R dev dir/ # 递归修改
- 修改属主通常需要 root 权限(
sudo)。 - 修改属组:若你是文件属主且是该组成员,通常可直接
chgrp。
参考:
man 1 chown、man 1 chgrp
五、目录权限的含义:r/w/x 在目录上的作用
这是新手最容易懵的点:同一组 rwx 权限,作用在文件和目录上含义完全不同!
5.1 rwx 在文件上的含义
| 权限 | 文件上的作用 |
|---|---|
| r | 读取文件内容(cat、less) |
| w | 修改/覆盖文件内容 |
| x | 执行该文件(脚本、程序) |
5.2 rwx 在目录上的含义
| 权限 | 目录上的作用 |
|---|---|
| r | 列出目录内容(能看到里面有哪些文件,ls) |
| w | 在目录中创建/删除/重命名文件(增删文件) |
| x | 进入/访问该目录(cd、访问其中文件) |
关键理解:
- 目录的
r只能"看到文件名列表",要"进入并访问"文件还需要x。 - 目录的
w控制的是"能否在这个目录里增删文件",与文件本身的权限无关。 - 对目录来说,
x(执行)更像"通行/访问"权限,是最关键的。
5.3 常见目录权限场景
| 目录权限 | 效果 |
|---|---|
| 755(rwxr-xr-x) | 属主全权,其他可进入并读取列表(常见,如 /home、/srv/www) |
| 700(rwx------) | 仅属主可进入和操作,其他人完全进不去(如 /root、个人主目录) |
| 777(rwxrwxrwx) | 任何人都能进入并增删文件(危险,如 /tmp 用特殊方式) |
ls -ld /home # 查看目录本身的权限(-d 只看目录)
ls -ld /root /tmp
六、特殊权限:setuid / setgid / sticky
在普通 rwx 之外,Linux 还有三种特殊权限,作用于执行文件和共享目录。
6.1 setuid(Set User ID,s 位在属主)
- 含义:以文件属主的身份运行该程序,而不是以执行者的身份。
- 典型例子:
/usr/bin/passwd有 setuid,普通用户执行它时能以 root 身份修改/etc/shadow。 - 表示:属主执行位显示为
s(rwsr-xr-x);若属主无 x,显示为S(大写,表示 setuid 已设但无执行位)。 - 数字:
chmod 4755(4 代表 setuid)。
ls -l /usr/bin/passwd # 看到 rwsr-xr-x,s 就是 setuid
sudo chmod 4755 program # 给程序设置 setuid
安全提示:setuid 会让程序以属主(常为 root)身份运行,风险极高,普通用户不要随意设置。
6.2 setgid(Set Group ID,s 位在属组)
- 对文件:以文件属组身份运行。
- 对目录(更常用):目录内新建的文件会自动继承该目录的属组,而不是创建者的主组。适合团队共享目录。
- 表示:属组执行位显示为
s(rwxrwsr-x)。 - 数字:
chmod 2755(2 代表 setgid)。
sudo chmod 2755 dir # 目录设置 setgid
sudo chmod g+s dir # 符号法:属组加 s
ls -ld dir # 看到 rwxrwsr-x
6.3 sticky bit(粘滞位,t 位)
- 含义:主要作用于共享目录(如
/tmp)。设置了 sticky 的目录,只有文件属主(或 root)才能删除/重命名该目录中的文件,即使目录本身对所有人可写。 - 表示:其他用户执行位显示为
t(drwxrwxrwt);若无 x 显示T。 - 数字:
chmod 1777(1 代表 sticky);/tmp通常是 1777。
ls -ld /tmp # 看到 drwxrwxrwt,t 就是 sticky
sudo chmod 1777 shared # 共享目录设置 sticky
sudo chmod +t shared # 符号法
6.4 三种特殊权限数字对照
| 特殊权限 | 数字 | 显示位置 | 典型用途 |
|---|---|---|---|
| setuid | 4 | 属主 x 位变 s/S | 让普通用户以属主身份执行(如 passwd) |
| setgid | 2 | 属组 x 位变 s/S | 目录内新文件继承目录属组 |
| sticky | 1 | 其他 x 位变 t/T | 共享目录防止他人删除你的文件(如 /tmp) |
# 设置特殊权限的符号法
chmod u+s file # setuid
chmod g+s dir # setgid
chmod +t dir # sticky
参考:
man 1 chmod、Red Hat - 文件系统权限与特殊权限
七、ACL 权限:setfacl / getfacl(进阶)
普通权限只能对三类对象(属主/属组/其他)授权,ACL(Access Control List,访问控制列表)可以对任意多个用户/组单独授权。
需要文件系统支持 ACL(ext4/xfs 默认支持)。
ls -l第一列末尾出现+就表示该文件有 ACL。
7.1 getfacl —— 查看 ACL
getfacl file.txt # 查看文件的 ACL
输出示例:
# file: file.txt
# owner: root
# group: root
user::rw- # 属主权限
user:alice:r-x # 用户 alice 被单独授权 r-x
group::r-- # 属组权限
mask::r-x # 掩码(ACL 有效权限上限)
other::r-- # 其他权限
7.2 setfacl —— 设置 ACL
# 给指定用户授权
setfacl -m u:alice:rwx file.txt # alice 获得 rwx
# 给指定组授权
setfacl -m g:dev:r-x file.txt # dev 组获得 r-x
# 递归设置目录及其内容
setfacl -R -m u:alice:rwx dir/
# 设置默认 ACL(目录内新建文件自动继承)
setfacl -m d:u:alice:rwx dir/
# 删除某个用户/组的 ACL
setfacl -x u:alice file.txt
# 删除文件所有 ACL(回到普通权限)
setfacl -b file.txt
参数说明:-m 修改/添加,-x 删除,-R 递归,-b 清空全部,d: 表示默认 ACL。
7.3 mask(掩码)
- ACL 中的
mask表示有效权限的上限:命名用户和命名组的实际有效权限 = 其授权 与 mask 取交集。 - 想调整整体上限可
setfacl -m m::rw file.txt。
参考:
man 5 acl、man 1 setfacl、man 1 getfacl、Red Hat - 文件系统权限(含 ACL)
八、权限掩码:umask 与默认权限
8.1 什么是 umask
新建文件/目录时,系统会用一个权限掩码(umask)来扣除默认权限,从而决定新文件的实际权限。
umask # 查看当前 umask(通常是 022)
umask 002 # 临时设置 umask
8.2 默认权限与 umask 计算规则
Linux 的基础默认权限:
- 文件:默认基础权限是 666(rw-rw-rw-)。
- 目录:默认基础权限是 777(rwxrwxrwx)。
实际权限 = 基础默认权限 − umask(按位扣除):
文件: 666 − 022 = 644 (rw-r--r--)
目录: 777 − 022 = 755 (rwxr-xr-x)
umask 022 的效果:属主完整权限,组和其他去掉写权限。这是最常用的默认值。
| umask | 新文件 | 新目录 |
|---|---|---|
| 022 | 644 | 755 |
| 002 | 664 | 775 |
| 077 | 600 | 700 |
| 000 | 666 | 777 |
计算示例:umask 为 002 时,新文件 = 666 − 002 = 664(rw-rw-r--),新目录 = 777 − 002 = 775。
umask # 查看当前值
touch new.txt; ls -l new.txt # 新文件权限
mkdir newdir; ls -ld newdir # 新目录权限
注意:umask 计算是按位相减(不是算术相减)。例如 umask 033 时,文件 = 666 − 033 = 644,目录 = 777 − 033 = 744。
永久设置:把 umask 002 写入 ~/.bashrc 或 /etc/profile。
参考:
man 1 umask、Red Hat - 文件系统权限(含 umask)
九、不可变属性:chattr(深化)
除了权限,Linux 还有文件属性(attribute),由 chattr 管理。最常用的是 不可变属性(immutable)。
9.1 chattr +i(不可变)
sudo chattr +i important.txt # 给文件加上不可变属性
sudo lsattr important.txt # 查看属性(看到 ----i--------)
sudo chattr -i important.txt # 移除不可变属性
- 加了
+i后,文件不能被修改、删除、重命名,连 root 也不行(除非先去掉属性)。 - 适合保护重要配置文件或防止误删。
lsattr查看属性,chattr修改。
9.2 其他常用属性
| 属性 | 作用 |
|---|---|
+i |
immutable 不可变(防修改/删除) |
+a |
append only 只能追加(适合日志) |
+R |
目录递归(recursive) |
+e |
extent 格式(默认) |
sudo chattr +a app.log # 只能追加,不能覆盖/删除
sudo chattr -a app.log # 移除追加属性
lsattr app.log # 查看属性
chattr/lsattr需要文件系统支持(ext4、xfs 支持;某些文件系统如部分网络盘不支持)。
参考:
man 1 chattr、man 1 lsattr
十、总结与练习
10.1 核心速查
| 需求 | 命令 |
|---|---|
| 查看权限 | ls -l / stat |
| 数字改权限 | chmod 755 文件 |
| 符号改权限 | chmod u+x,g-w 文件 |
| 递归改权限 | chmod -R 755 目录 |
| 改属主 | sudo chown alice 文件 |
| 改属主+属组 | sudo chown alice:dev 文件 |
| 改属组 | chgrp dev 文件 |
| 特殊权限 | chmod 4755(setuid)/2755(setgid)/1777(sticky) |
| 查看 ACL | getfacl 文件 |
| 设置 ACL | setfacl -m u:alice:rwx 文件 |
| 查看 umask | umask |
| 不可变属性 | sudo chattr +i 文件 |
| 查看属性 | lsattr 文件 |
10.2 动手练习建议
# 1. 查看与理解权限
ls -l /etc/hosts /usr/bin/passwd
stat /etc/hosts
# 2. 修改权限
echo "test" > /tmp/p.txt
chmod 644 /tmp/p.txt; ls -l /tmp/p.txt
chmod u+x,g-w /tmp/p.txt; ls -l /tmp/p.txt
# 3. 属主与属组
sudo chown root:root /tmp/p.txt
ls -l /tmp/p.txt
# 4. 目录权限体验
mkdir -p /tmp/dirperm; chmod 000 /tmp/dirperm; ls /tmp/dirperm # 无权限
chmod 755 /tmp/dirperm; ls -ld /tmp/dirperm
# 5. 特殊权限与 umask
ls -ld /tmp; umask; touch /tmp/um.txt; ls -l /tmp/um.txt
# 6. ACL
touch /tmp/acl.txt; setfacl -m u:nobody:rw /tmp/acl.txt; getfacl /tmp/acl.txt
# 7. chattr 保护文件
echo "important" > /tmp/imp.txt; sudo chattr +i /tmp/imp.txt
rm /tmp/imp.txt # 会失败(不可变)
sudo chattr -i /tmp/imp.txt; rm /tmp/imp.txt # 先去掉属性再删
提示:练习请在虚拟机(如 Rocky Linux)中进行,避免影响真实系统。权限相关命令(chown、chattr)多数需要
sudo。
参考资料
- coreutils man 手册:
man 1 chmod、man 1 chown、man 1 chgrp、man 1 ls、man 1 stat、man 1 umask man 1 chattr、man 1 lsattrman 5 acl、man 1 setfacl、man 1 getfacl- Red Hat 官方文档 - 管理文件系统权限:https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/configuring_basic_system_settings/managing-file-system-permissions_configuring-basic-system-settings
- Rocky Linux 官方文档 - 权限管理:https://docs.rockylinux.org/books/admin_guide/14-special-authority/
- 菜鸟教程 - Linux 文件权限:https://www.runoob.com/linux/linux-file-attr-permission.html