Linux 权限管理

Administrator 12

Linux 权限管理


目录

  1. 权限的基本概念
  2. 查看权限:ls -l 里的 rwx
  3. 普通权限修改:chmod
  4. 修改属主与属组:chown / chgrp
  5. 目录权限的含义:r/w/x 在目录上的作用
  6. 特殊权限:setuid / setgid / sticky
  7. ACL 权限:setfacl / getfacl(进阶)
  8. 权限掩码:umask 与默认权限
  9. 不可变属性:chattr(深化)
  10. 总结与练习

一、权限的基本概念

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 chownman 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

参考:Red Hat - 管理文件系统权限菜鸟教程 - Linux 文件基本属性


六、特殊权限:setuid / setgid / sticky

在普通 rwx 之外,Linux 还有三种特殊权限,作用于执行文件和共享目录。

6.1 setuid(Set User ID,s 位在属主)

  • 含义:以文件属主的身份运行该程序,而不是以执行者的身份。
  • 典型例子/usr/bin/passwd 有 setuid,普通用户执行它时能以 root 身份修改 /etc/shadow
  • 表示:属主执行位显示为 srwsr-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 位在属组)

  • 对文件:以文件属组身份运行。
  • 对目录(更常用):目录内新建的文件会自动继承该目录的属组,而不是创建者的主组。适合团队共享目录。
  • 表示:属组执行位显示为 srwxrwsr-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)才能删除/重命名该目录中的文件,即使目录本身对所有人可写。
  • 表示:其他用户执行位显示为 tdrwxrwxrwt);若无 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 chmodRed 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 aclman 1 setfaclman 1 getfaclRed 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 umaskRed 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 chattrman 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


参考资料