# Linux基础指令(三):权限系统详解

📅 2026/7/1 3:20:19
# Linux基础指令(三):权限系统详解
Linux基础指令三权限系统详解本文是 Linux 基础指令系列的第三篇聚焦 Linux 权限系统——从本质理解到实操细节这是整个系列中最重要、也最容易被低估的一章。上一篇[二系统认知与效率]权限的本质能和不能做什么在深入命令之前先回到原点——什么是权限权限的本质只有一个确定什么能做什么不能做。它是一张允许清单操作系统每收到一个操作请求就去查这张清单——符合条件就放行不符合就拒绝。为什么需要权限两个核心原因防止误操作——阻止一个手滑的rm -rf毁掉全系统阻止一个错误的配置修改让服务瘫痪隔离用户——Linux 是多用户操作系统。张三的文件不该被李四看A 部门的代码不该被 B 部门改。权限划出了每个人的活动边界理解权限有一个关键认知权限的首要限制对象是人身份不是文件。权限始终围绕谁角色能对什么资源做什么操作属性展开。权限和角色是绑定的——对一个文件做操作之前系统先看你是谁再决定放不放行。用公式表达权限 角色拥有者 / 所属组 / other 属性读 r / 写 w / 执行 x其中所属组的存在是为了更精细化的权限管理一个文件的所有者可以把它共享给同组的同事同时对外人保密。而other是以上都不是的兜底角色——无需事先记录只要不匹配前两种就按 other 的规则来。用户分类Linux 下有两类用户超级用户root命令提示符#可以做任何事情不受权限限制普通用户命令提示符$仅在自己的权限范围内操作重点root 不受限。Linux 的权限检查对 root 完全不生效——root 可以读写执行任何文件可以进入任何目录。这也是为什么日常操作绝不建议用 root 登录。su用户名# switch user — 切换用户suroot# 切换到 rootroot 可省略su-# 加载目标用户环境变量推荐su的问题是一旦切到 root你就一直以最高权限运行——直到手动退出。敲的每一条命令都不受限制包括那个写错路径的rm -rf。sudosuperuser do— 短暂提权sudosuperuser do的设计思路更安全只让当前这一条命令以 root 身份执行执行完立即回到普通用户。从实现上看Linux 只安装一套软件sudo提供了一个类似白名单的机制——管理员通过编辑/etc/sudoers配置文件精确控制哪些用户可以使用sudo执行哪些命令。sudoyuminstall-yvim# 以 root 身份安装软件包sudosystemctl restart nginx# 以 root 身份重启服务sudo-i# 短暂进入 root shell用 exit 退出sudovssu的核心区别susudo权限范围整个 shell 会话仅当前一条命令需要谁的密码目标用户如 root的密码当前用户的密码安全审计无记录每次执行记录在/var/log/secure推荐程度仅特殊情况日常首选生产环境中sudo是绝对的主流——管理员不需要知道 root 密码只需将自己的账号加入sudoers授权文件就能在需要时临时提权。root 密码可以安全地封存甚至禁用这才是真正的权限最小化。 Ubuntu 默认禁用 root 直接登录一切特权操作都走sudo。这不是偷懒是刻意为之的安全设计。退出管理员身份无论用了su还是sudo -i当前 shell 变成了 root——怎么退回去exit# 退出当前 shell回到上一个用户logout# 等价于 exit在登录 shell 中使用按CtrlD也可以——它向 shell 发送 EOF 信号效果等同于exit。验证自己当前是谁whoami# 显示当前用户名id# 显示当前用户的 UID、GID 和所属组提示符也能帮你判断$是普通用户#是 root。养成敲命令之前瞥一眼提示符的习惯——以 root 身份执行日常操作是 Linux 新手最容易犯的危险习惯之一。文件访问者分类每个文件面向三类访问者符号角色含义uUser所有者文件的创建者gGroup所属组文件所有者所在的用户组oOthers其他人既非所有者也不在所属组的用户关键规则在 CentOS 下用户角色的确定只有一次按照 拥有者 → 所属组 → other 的顺序依次匹配。一旦匹配成功就不再往下判断。也就是说如果你是文件的所有者系统只用 owner 权限来判断你能做什么——即使所属组有更宽松的权限也不会生效因为你已经被认领为 owner 了。文件类型与权限ls -l输出的第一个字符代表文件类型字符类型-普通文件d目录l软链接类似 Windows 快捷方式b块设备文件硬盘等c字符设备文件终端等p管道文件s套接字文件随后九个字符每三个一组分别代表 u / g / o 的读r、写w、**执行x**权限。-表示不具备该权限。-rwxr-xr--解读普通文件所有者可读可写可执行rwx所属组可读可执行r-x其他人仅可读r–。重要可执行权限x不意味文件一定可以被执行。x 权限只是允许尝试执行的通行证——如果你给一个文本文件加了 x 权限试图运行它系统能做的也只是尝试去执行至于能不能执行起来取决于文件内容本身是否是可执行格式如 ELF 二进制或带 shebang 的脚本。权限管的是准不准不是能不能。权限的数字表示权限字母数字值读r4写w2执行x1rwx 421 7rw- 42 6r-- 4。于是rwxr-xr-- 754。八进制表示法可以覆盖从完全开放到完全封闭的整个权限范围chmod 777赋予所有人全部权限chmod 000则让所有人除 root都无法访问。chmodchange file mode bits— 修改权限# 字符表示法u/g/o/a ± r/w/xchmoduwr,g-wr,ox my.txt# 所有者加读写、所属组去读写、其他人加执行chmodax my.txt# 所有人加执行权限chmoduw /home/abc.txt# 所有者增加写权限chmodo-x /home/abc.txt# 其他用户移除执行权限chmodar /home/abc.txt# 所有人仅保留读权限# 八进制数字表示法chmod664/home/abc.txt# rw-rw-r--chmod755script.sh# rwxr-xr-xchmod777shared_dir/# rwxrwxrwx完全开放chmod000 secret.txt# ---------除 root 外无人能访问# 递归修改chmod-R755/path/to/dir/重点用户只能修改自己的文件权限。如果你不是文件的所有者且不是 rootchmod会直接报Operation not permitted。系统同样会拒绝任何无权限的访问返回Permission denied。chownchange file owner与chgrpchange group ownership— 更改归属chownuser1 f1# 将 f1 的所有者改为 user1chown-Ruser1 filegroup1/# 递归修改整个目录chgrpusers/abc/f2# 将 f2 的所属组改为 users注意系统默认不允许把文件权限送给别人。只有 root 或具有更高权限的用户才能执行chown/chgrp——否则普通用户之间随意转交文件所有权会成为安全漏洞。umaskuser file-creation mode mask— 默认权限掩码创建新文件或目录时权限并不是凭空产生的——每种文件类型都有一个起始权限再经过 umask 的裁剪才形成最终权限。普通文件起始权限默认为0666rw-rw-rw-默认不带可执行权限——这是合理的因为大多数新建文件源代码、配置文件、文档都不该默认可执行目录文件起始权限默认为0777rwxrwxrwx默认携带可执行权限——因为进入目录需要 x如果没有 x连cd都进不去最终权限的计算公式最终权限 起始权限 (~umask)umask的实质目的凡是出现在 umask 里的权限位都不应该出现在最终权限里。可以理解为一张创建时自动抹除的权限清单。umask# 查看当前掩码root 默认 0022普通用户默认 0002umask044# 设置掩码以普通文件为例起始0666umask0002最终权限 666 ~002666 775664rw-rw-r--。这就是为什么touch一个新文件后ls -l看到的是664而不是666。为什么需要 umask系统可配置灵活满足需求——默认权限由系统决定你无法在创建文件之前逐一手动指定权限。umask 提供了一种全局的安全默认值确保所有新文件都出生在你设定的安全基线之上代码可控——在特殊场景比如安全敏感的服务下通过配置 umask 可以保证进程创建的所有文件默认就是受限的不需要在代码中额外chmod目录权限的深层理解目录权限和普通文件权限有着本质不同的含义权限对普通文件的含义对目录的含义r读可以读取文件内容可以ls查看目录内有哪些文件w写可以修改文件内容可以在目录内创建/删除文件x执行可以执行该文件可以cd进入该目录几个需要牢记的规则想要进入目录必须拥有 x 权限——没有 x连cd都执行不了如果对目录没有 r 权限无法查看目录内部的文件列表——你知道里面有文件也ls不了如果对目录没有 w 权限无法在该目录内新建或删除文件——哪怕你对目录内的文件本身拥有全部权限也没用一个容易犯错的组合目录有r但没有x。此时无法cd进入目录也无法访问目录内的文件——读权限在目录上的含义是读取目录项列表不是读取目录下的文件内容。 默认情况下任何普通用户都无权进入其他用户的家目录/home/username/。这是 Linux 多用户隔离的基本设计——你的家目录就是你的私人空间。为什么文件能删除但不能写这是一个经典的 Linux 权限面试题。设想场景你对/shared/report.txt拥有rw-权限可以自由读写。但你尝试删除它时却失败了。为什么答案删除一个文件需要的是该文件所在目录的写权限w而不是文件自身的写权限。删除的本质是从目录中移除一条文件名 → inode的映射记录——这个操作修改的是目录文件的内容不是被删除文件的内容。所以系统检查目录的 w 权限而不是文件的 w 权限。这引申出一个实践原则两个用户需要共享文件时应该把目录放在一个双方都有 w 权限的公共位置如/tmp/或专门的共享目录而不是放在某人的家目录下。粘滞位Sticky Bit上一条规则的直接后果一个目录有写权限就意味着任何能在该目录中操作的用户都能删除目录中的任何文件——即使这个文件不属于他。这在共享目录中显然是不合理的。粘滞位解决了这个问题chmodt /shared_dir/# 给目录添加粘滞位# 数字表示法在权限前面加 1如 chmod 1777 /shared_dir/设置粘滞位后目录下的文件只能由以下角色删除超级管理员root该目录的所有者该文件的所有者/tmp目录就是粘滞位的典型应用——每个用户都能在里面创建临时文件但不能删除别人的。ls -ld /tmp可以看到它的权限第一位是tdrwxrwxrwt。本节要点权限 角色u/g/o 属性r/w/x权限的首要限制对象是人身份不是文件。数字表示法4/2/1在脚本中更常用八进制从 000 到 777CentOS 下角色确定只有一次按 owner → group → other 顺序匹配一旦命中就不再往下判断root 不受限——Linux 的权限检查对 root 完全不生效日常操作绝不用 root 登录可执行权限 ≠ 文件一定可以执行——x 只代表允许尝试能不能真正执行取决于文件内容用户只能修改自己的文件权限chown/chgrp不允许普通用户把权限转交给别人——只有 root 能做sudo只提权一条命令su提权整个 shell。sudo通过/etc/sudoers白名单控制生产环境首选sudoexit/CtrlD退出当前 shellwhoami确认身份。看一眼提示符——$还是#——比什么都管用目录的 x 权限决定能不能进去r 权限决定能不能列出内容w 权限决定能不能在里面新建/删除文件。三者是独立的删除文件需要的是目录的 w 权限不是文件自身的 w 权限——因为删除是从目录中移除一条映射修改的是目录而非文件任何人无权进入别人的家目录——Linux 多用户隔离的基本设计粘滞位Sticky Bit让共享目录下的文件只能由文件所有者删除/tmp是典型应用普通文件起始权限 666目录起始权限 777。最终权限 起始权限 (~umask)——umask 是你设置安全默认值的工具凡是出现在 umask 里的权限都不该出现在最终权限里