《Linux系统编程》3.Linux权限

《Linux系统编程》第三章通常会重点讲解 Linux 权限模型(文件权限、用户/组、特殊权限等),这是系统编程中最基础且最常被考察/面试的部分。

以下内容以现代主流 Linux(2025–2026 视角,RHEL 9 / Ubuntu 24.04 / Debian 12+ / Rocky 9 等)整理,覆盖教材中最核心的知识点 + 编程中真正会用到的细节。

1. Linux 权限基础三元组(rwx)

位置含义(对文件含义(对目录八进制值
r可以读取文件内容(cat、less)可以列出目录内容(ls)4
w可以修改文件内容(vim、echo >>)可以在目录中创建/删除/重命名文件(即使文件权限不允许)2
x可以执行文件(./a.out、脚本)可以进入目录(cd)、访问目录内文件(需配合文件自身权限)1

最容易混淆的点(面试/笔试常考):

  • 对文件:没有 w 也能删除文件(只要对父目录有 w+x 即可)
  • 对目录:只有 x 没有 r → 能 cd 进去、能访问已知文件名文件,但 ls 看不到内容
  • 对目录:只有 w 没有 x → 几乎没用(无法 cd 进去,也无法操作里面的文件)

2. 权限表示方式对比

表示方式示例含义常用场景
符号法rwxr-xr–owner:rwx group:r-x other:r–ls -l 直观显示
八进制(3位)7547= rwx, 5= r-x, 4= r–chmod 常用
八进制(4位)47554 = SUID + 755特殊权限
符号法修改chmod u+s,g-w,o=r fileowner 加 SUID, group 去写, other 只读精细控制

3. 特殊权限(SUID / SGID / Sticky Bit)—— 第三章重中之重

权限八进制字符显示位置只对谁有效?典型文件/目录示例实际效果说明
SUID4xxxuser 的 x 位变 s / S可执行文件/usr/bin/passwd (4755)执行时进程有效 UID = 文件所有者 UID(通常 root)
SGID2xxxgroup 的 x 位变 s / S可执行文件 + 目录/usr/bin/wall (2755)
/tmp (常不设)
文件:进程有效 GID = 文件所属组
目录:新建文件/子目录自动继承父目录的所属组
Sticky Bit (SBIT / 粘滞位)1xxxother 的 x 位变 t / T仅目录/tmp (1777)目录中文件只有文件拥有者、目录拥有者、root 才能删除/改名(即使别人有 w)

字符 vs 大小写含义:

  • 小写 s/t → x 权限同时存在
  • 大写 S/T → x 权限不存在(很少见,通常是配置错误)

常见真实例子(2025–2026 主流发行版基本一致):

# SUID 典型代表
-rwsr-xr-x  1 root root  68208 Dec 20  2024 /usr/bin/passwd     # 允许普通用户改自己密码

# SGID 例子(较少见于文件,常见于目录协作开发)
-rwsr-sr-x  1 root tty   27248 Dec 20  2024 /usr/bin/write.ul   # wall/write 命令

# Sticky Bit 经典
drwxrwxrwt  15 root root   4096 Mar  6 00:30 /tmp               # 任何人可写,但只能删自己的文件

4. 常用权限管理命令速查表

命令主要功能常用写法示例备注
chmod修改权限chmod 4755 prog
chmod u+s,g+s,o+t dir
支持 -R 递归
chown改属主(可顺带改组)chown root:devops file
chown -R user:group /dir
普通用户只能改自己文件
chgrp只改所属组chgrp developers shared_dir现在较少用(chown 可同时改)
umask设置新建文件/目录的默认权限掩码umask 027文件默认 666-umask,目录 777-umask
lsattr / chattr查看/设置文件扩展属性(+i 不可改)chattr +i important.conf防误删/防改(非标准权限)

umask 快速记忆(最常见值):

  • root 默认 umask 022 → 新文件 644,新目录 755
  • 普通用户默认 umask 002 → 新文件 664,新目录 775(共享组写)

5. 系统编程中常考/常犯的权限相关点(C语言视角)

  1. stat() / fstat() / lstat() → st_mode 字段包含所有权限信息
  • 用 S_ISUID / S_ISGID / S_ISVTX 宏判断特殊位
  • 用 S_IRUSR / S_IWUSR / S_IXUSR 等宏判断 rwx
  1. chmod() / fchmod() 系统调用(而非命令)
  2. chown() / fchown() / lchown() —— 注意普通用户基本无权调用
  3. access() —— 检查调用者真实身份是否有权限(常用于 setuid 程序自检)
  4. setuid() / setgid() / seteuid() / setegid() —— 权限降级/切换(setuid 程序必备)
  5. 最经典的 setuid 安全陷阱
  • 不要在 setuid 程序中调用 system() / popen()
  • 永远先把 euid 降回 ruid(真实用户)再做危险操作

6. 快速自测题(第三章常考)

  1. /tmp 为什么是 1777 而不是 777?
  2. passwd 命令为什么要有 SUID?去掉会怎样?
  3. 一个目录权限是 drwx–x–x,用户能做什么?不能做什么?
  4. umask 设成 027,新建文件和目录分别是什么权限?
  5. 如何给一个共享开发目录设置“新建文件自动属于开发组”?

需要我针对其中某个点展开更详细的代码示例(C语言获取/设置权限、setuid程序写法、安全降权模板等),还是需要解释某个具体场景的权限设计?

文章已创建 4915

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部