de风——【从零开始学习Linux】(三):全面总结瞧一瞧,权限管理没烦恼
前言操作环境Xshell 7 腾讯云服务器CentOS 7适合人群Linux 零基础新手系列文章Linux专题链接https://blog.csdn.net/xiao_running/category_13167800.html?fromshareblogcolumnsharetypeblogcolumnsharerId13167800sharereferPCsharesourceXiao_runningsharefromfrom_link大家好我是正在学习 Linux 的小小风呀说实话刚接触 Linux 权限的时候我是一脸懵的。什么rwx、chmod 755、chown、umask……一堆概念扑面而来光是看ls -l的输出都觉得头大。后来我静下心来把权限相关的知识点一条条啃下来整理成了这篇笔记。现在分享出来希望能帮到和我一样正在入门 Linux 的同学。本文覆盖的知识点权限的基本概念谁有权限有什么权限如何修改权限chmod如何修改文件归属chown/chgrp新文件的默认权限是怎么来的umask三个特殊权限位SUID / SGID / Sticky Bit新手常见问题速查每个知识点下面都有代码示例可以直接在腾讯云服务器上敲一遍印象会深刻很多。文章思维导图下图梳理了本文所有核心知识点建议先浏览全图建立整体认知再逐节深入阅读。建议右击图片 → 在新标签页中打开查看高清大图 目录一、权限基本概念1. 为什么要有权限2. 用户分类root 与普通用户3. 身份切换su 与 sudo4. 角色分类U / G / O5. 文件权限r / w / x6. 目录权限r / w / x 的含义不同7. 读懂 ls -l 的权限字符串8. 权限的数字表示法二、chmod —— 修改文件权限语法形式功能说明代码示例延伸扩展三、chown —— 修改文件所有者语法形式功能说明代码示例延伸扩展四、chgrp —— 修改文件所属组语法形式功能说明代码示例延伸扩展五、umask —— 默认权限掩码语法形式功能说明代码示例延伸扩展六、特殊权限SUID / SGID / Sticky Bit6.1 SUIDSet User ID6.2 SGIDSet Group ID6.3 Sticky Bit粘滞位七、新手常见问题速查总结一、权限基本概念1. 为什么要有权限Linux 是一个多用户操作系统同一台服务器上可能有多个用户同时登录比如你们团队的几个人共用一台腾讯云服务器。如果大家都能随意修改彼此的文件那不乱套了吗所以 Linux 设计了一套权限系统主要目的有三个控制用户行为防止误操作破坏系统文件安全隔离不同用户之间的数据相互隔离A 用户看不到 B 用户的私密文件权限 角色 目标属性权限首先限制的是角色你是谁同时要求目标文件/目录必须具备对应的属性是否允许读/写/执行2. 用户分类root 与普通用户Linux 把用户分为两大类用户类型说明权限范围root超级管理员系统最高权限用户UID 0不受任何权限限制可以对所有文件为所欲为普通用户日常使用的账号如alice、bob权限受限只能操作自己有权限的文件⚠️重要root 用户是不受权限约束的。即使某个文件的权限是----------所有人无任何权限root 依然可以读写执行它。这是很多 Linux 安全问题的根源——如果黑客拿到了 root 权限就等于掌控了整台服务器。3. 身份切换su 与 sudo日常操作中我们经常需要在普通用户和 root 之间切换。su —— 切换用户身份# 普通用户 → root需要输入 root 密码 su # 切换到 root当前目录不变 su - # 切换到 root并跳转到 root 的家目录/root # root → 普通用户无需密码 su alice # 切换到 alice 用户 su - alice # 切换到 alice并跳转到 alice 的家目录 # 退出当前用户回到上一个用户 exit # 或直接按 Ctrl Dsu与su -的区别su只切换用户身份但保留当前所在目录和环境变量su -完全模拟一次登录会切换到目标用户的家目录并加载其环境变量。推荐用su -环境更干净。sudo —— 短暂提权推荐# 以 root 权限执行单条命令输入的是当前用户的密码不是 root 密码 sudo apt update # Ubuntu/Debian 系统 sudo yum install nginx # CentOS/RHEL 系统✅为什么推荐 sudo 而不是 susudo只给单条命令提权执行完就回到普通用户身份降低误操作风险。su切换到 root 后如果不小心敲了rm -rf /就真的完了。Ubuntu 的特殊之处Ubuntu 默认禁用 root 远程登录只能通过sudo su切换到 rootsudo su # Ubuntu 上切换到 root 的正确方式4. 角色分类U / G / O权限系统需要知道谁在访问文件。Linux 把访问者分为三类角色简称UGO角色缩写全称含义拥有者uUser文件的创建者owner所属组gGroup文件所属的用户组group其他人oOthers既不是拥有者也不在所属组中的用户为什么要有所属组假设你和同事bob、carol在同一个开发团队需要共同维护/data/project目录。如果只用拥有者和其他人两个角色你要么给所有人开放权限不安全要么只能给自己开放同事无法协作。引入所属组后你可以把/data/project的组设为devteam然后把bob和carol都加入这个组这样组内的三个人都有相应权限组外的人则没有。实现了精细化的权限管理。5. 文件权限r / w / x对普通文件来说三种权限的含义权限符号数值对文件的意义读r4可以读取文件内容如cat、less、vim打开查看写w2可以修改文件内容如vim编辑并保存、echo 追加执行x1可以作为程序/脚本执行如./script.sh⚠️注意有x权限只是有机会执行文件本身需要是可执行程序如编译后的二进制文件或脚本如.sh文件且开头有#!/bin/bash才能真正运行。6. 目录权限r / w / x 的含义不同目录的权限含义和文件完全不同这是新手最容易混淆的地方权限符号对目录的意义读r可以列出目录内容如ls命令能看到目录下有哪些文件写w可以在目录中增删文件如touch新建、rm删除、mv重命名执行x可以进入目录如cd到该目录以及访问目录内文件的元数据核心要点要操作目录里的文件首先得有目录的x权限举个例子目录权限是r--只有读没有执行你用ls能看到文件名但用cat filename会报Permission denied因为你没有x权限进入目录去访问文件内容。7. 读懂 ls -l 的权限字符串用ls -l命令可以查看文件的详细权限信息$ ls -l total 8 -rw-rw-r-- 1 alice alice 1024 Sep 24 19:06 my.txt drwxr-x--- 2 bob devs 4096 Sep 24 20:30 myproject/下面逐位解读第一列的权限字符串以-rw-rw-r--为例- rw- rw- r-- │ │ │ └── 其他人Others的权限r--只读 │ │ └─────── 所属组Group的权限rw-读写不可执行 │ └──────────── 拥有者User的权限rw-读写不可执行 └──────────────── 文件类型- 普通文件d 目录l 软链接位置字符含义第 1 位-/d/l文件类型第 2~4 位rw-拥有者User权限第 5~7 位rw-所属组Group权限第 8~10 位r--其他人Others权限再来看第二列1 alice alice的含义1硬链接数量第一个alice拥有者owner第二个alice所属组group8. 权限的数字表示法除了用rwx字母表示Linux 还支持用八进制数字来表示权限这在chmod命令中非常常用。计算方法把r/w/x分别对应的数值相加。权限二进制八进制---0000--x0011-w-0102-wx0113r--1004r-x1015rw-1106rwx1117常见权限组合速查数字权限字符串含义典型用途644rw-r--r--所有者读写其他人只读普通文件的默认权限755rwxr-xr-x所有者全权限其他人读和执行可执行文件 / 目录的默认权限600rw-------只有所有者读写私密文件如 SSH 私钥700rwx------只有所有者有全部权限私密目录777rwxrwxrwx所有人都有全部权限⚠️ 谨慎使用二、chmod —— 修改文件权限语法形式chmod [选项] 权限模式 文件或目录常用选项选项说明-R递归修改将目录及其下所有内容一并修改权限-v显示详细的修改过程verbose权限模式有两种写法① 数字模式推荐简洁高效chmod 755 filename # rwxr-xr-x chmod 644 filename # rw-r--r--② 符号模式直观易读chmod ux filename # 给拥有者u添加执行x权限 chmod g-w filename # 给所属组g去掉-写w权限 chmod or filename # 将其他人o的权限精确设置为只读r chmod ax filename # 给所有人aall添加执行权限符号模式中的操作符操作符含义添加权限不影响已有权限-去除权限精确设置权限覆盖原有权限功能说明chmodchangemode用于修改文件或目录的访问权限是 Linux 权限管理中使用频率最高的命令。✅谁可以执行 chmod文件的拥有者自己就能改不需要 root 权限。当然 root 也可以改任何文件的权限。代码示例① 数字模式最常用# 示例1刚写好的部署脚本需要添加执行权限 chmod 755 deploy.sh ls -l deploy.sh # 输出-rwxr-xr-x 1 alice alice 2048 Sep 24 21:00 deploy.sh # 示例2私密配置文件只允许自己读写 chmod 600 /etc/myapp/config.conf ls -l /etc/myapp/config.conf # 输出-rw------- 1 alice alice 512 Sep 24 21:05 config.conf # 示例3网站根目录标准权限 chmod 755 /var/www/html ls -ld /var/www/html # 输出drwxr-xr-x 2 alice alice 4096 Sep 24 21:10 /var/www/html/② 符号模式更直观# 示例1给脚本添加执行权限最常用场景 chmod ux backup.sh # 示例2去掉其他人的写权限防止被篡改 chmod o-w important.txt # 示例3同时操作多个角色 chmod urwx,grx,o-rx myapp # 含义u加读写执行g加读执行o去掉读执行 # 示例4用 精确设置权限 chmod urw,gr,o secret.txt # 含义urw, gr, o无权限等价于 chmod 640③ 递归修改目录部署时常用# 将整个网站目录递归设为 755 chmod -R 755 /var/www/mysite # 验证结果 ls -la /var/www/mysite | head -10延伸扩展1. 刚创建的脚本无法直接运行这是新手最高频的问题默认新建的.sh文件没有x权限运行时会报Permission denied./deploy.sh # bash: ./deploy.sh: Permission denied # 解决方法 chmod x deploy.sh ./deploy.sh # 现在可以运行了2. 不要随意使用 chmod 777chmod 777 /var/www/html # ❌ 危险所有人都能读写执行777 意味着任何人都可以修改这个文件/目录在公网服务器上等于敞开大门欢迎黑客。正确做法先想清楚需要给哪些人什么权限再用精准的权限设置如 755、644。3. 权限匹配顺序只匹配一次Linux 检查权限时是按顺序匹配的而且只匹配一次顺序拥有者u→ 所属组g→ 其他人o举例文件权限是-rw-rw-r--用户ggb来访问先检查ggb是拥有者吗不是 → 继续再检查ggb在所属组whb里吗不在 → 继续最后ggb属于其他人o使用r--权限重要如果ggb既是拥有者又在所属组里系统只会按拥有者匹配一次不会再去检查组权限。三、chown —— 修改文件所有者语法形式chown [选项] 新所有者[:新所属组] 文件或目录常用选项选项说明-R递归修改目录及其下所有内容-v显示修改详情功能说明chownchangeowner用于修改文件或目录的拥有者也可以同时修改所属组。⚠️重要限制只有 root 才能执行 chown普通用户即使是文件的当前拥有者也无法把文件转让给另一个用户。这和 Windows 不一样Windows 里你可以把自己的文件赠予别人但 Linux 不行。原因如果允许普通用户随意chown他可以先把别人的文件chown给自己修改完再chown回去就能绕过权限限制了。代码示例① 只修改拥有者# 把 myfile.txt 的拥有者改为 alice需要 root 权限 sudo chown alice myfile.txt # 验证 ls -l myfile.txt # 输出-rw-r--r-- 1 alice alice 0 Sep 24 21:30 myfile.txt # ↑ 拥有者已变为 alice② 同时修改拥有者和所属组# 把 project/ 的拥有者改为 alice所属组改为 devteam sudo chown alice:devteam project/ # 查看结果 ls -ld project/ # 输出drwxr-xr-x 2 alice devteam 4096 Sep 24 21:35 project/ # 也可以只改组保留冒号省略拥有者 sudo chown :devteam myproject/③ 递归修改部署 Web 项目时必用# 把网站目录的所有者和组都改为 nginxNginx 运行用户 sudo chown -R nginx:nginx /var/www/mysite # 验证 ls -la /var/www/mysite | head -5延伸扩展1. 冒号:与点号.的区别老版本 Linux 支持用点号.分隔拥有者和组chown alice.devteam project/ # 老写法不推荐 chown alice:devteam project/ # 新写法推荐现在统一用冒号:更清晰也不会和文件名中的点号混淆。2. 部署 Web 项目时的标准操作在腾讯云服务器上部署网站通常需要把网站目录的拥有者改为 Web 服务器运行用户# Nginx 用户通常是 nginx 或 www-data取决于系统 sudo chown -R nginx:nginx /var/www/mysite sudo chmod -R 755 /var/www/mysite这样 Nginx 进程才能读取和写入网站文件。3. chown vs chmod别搞混chmod改的是权限谁能读/写/执行→ 拥有者自己就能改chown改的是归属文件属于谁→ 只有 root 能改四、chgrp —— 修改文件所属组语法形式chgrp [选项] 新所属组 文件或目录常用选项选项说明-R递归修改目录及其下所有内容功能说明chgrpchangegroup用于修改文件或目录的所属组。其实chgrp能做的事chown也能做用chown :组名的语法。chgrp作为一个独立命令存在主要是语义更清晰——当你只想改组、不想改拥有者的时候chgrp的意图更明确不容易误操作。代码示例① 修改文件的所属组# 把 report.txt 的组改为 finance财务组 sudo chgrp finance report.txt # 验证 ls -l report.txt # 输出-rw-r--r-- 1 alice finance 2048 Sep 24 21:40 report.txt # ↑ 组已变为 finance② 递归修改目录的所属组# 把项目目录的组改为 developers sudo chgrp -R developers /data/project # 验证 ls -la /data/project | head -5③ chgrp 与 chown 的等价写法# 以下两条命令效果完全相同 sudo chgrp developers myfile.txt sudo chown :developers myfile.txt延伸扩展1. 如何查看系统中有哪些组# 查看所有组每行格式组名:x:GID:成员列表 cat /etc/group # 查看当前用户属于哪些组 groups # 输出alice : alice devteam sudo # 查看指定用户属于哪些组 groups alice2. 如何把用户加入某个组# 把用户 bob 加入 developers 组需要 root sudo usermod -aG developers bob⚠️ 注意-aG的a是 append追加如果漏掉a会覆盖用户原有的组修改后需要重新登录才能生效。3. 用组来管理团队权限最佳实践场景你和bob、carol需要共同维护/data/shared目录# 步骤1创建 devteam 组root 操作 sudo groupadd devteam # 步骤2把三个人加入 devteam 组 sudo usermod -aG devteam alice sudo usermod -aG devteam bob sudo usermod -aG devteam carol # 步骤3设置目录权限 sudo chgrp -R devteam /data/shared sudo chmod -R 2770 /data/shared # 2770 rwxrws---含 SGID见第六节这样devteam 组内的三个人都有读写权限组外人员完全无法访问。五、umask —— 默认权限掩码语法形式umask # 查看当前 umask 值数字形式 umask -S # 查看当前 umask 值符号形式 umask 新值 # 临时修改 umask仅当前 Shell 会话有效功能说明umaskuser file-creationmask是一个权限掩码它决定了新创建的文件和目录的默认权限。理解 umask 需要先知道两个起始权限文件类型起始权限最大可能权限含义普通文件666rw-rw-rw-文件默认不应该有执行权限目录777rwxrwxrwx目录需要 x 权限才能进入为什么文件的起始权限是 666 而不是 777因为 Linux 认为一个普通文件被创建出来时不应该自动获得执行权限。如果你需要执行它必须明确地给它加x权限。这是安全设计——防止某些攻击手法通过上传文件自动执行来入侵系统。最终权限的计算公式重要最终权限 起始权限 (~umask)这里的是按位与~是按位取反。umask 中起作用的位会在最终权限中被遮罩掉。代码示例① 查看当前 umask# 查看 umask 值 $ umask 0022 # 最前面的 0 是八进制前缀实际 umask 值是 022 # 以符号形式查看更直观 $ umask -S urwx,grx,orx # 含义umask 遮罩掉了 g 的 w 权限和 o 的 w 权限② 验证 umask 对新文件/目录的影响# 当前 umask 022 $ umask 0022 # 创建一个新文件 $ touch testfile.txt $ ls -l testfile.txt -rw-r--r-- 1 alice alice 0 Sep 24 22:00 testfile.txt # 权限 644计算过程见下方 # 创建一个新目录 $ mkdir testdir $ ls -ld testdir drwxr-xr-x 2 alice alice 4096 Sep 24 22:01 testdir/ # 权限 755计算过程见下方权限计算过程umask 022文件起始 666umask 022 666 110 110 110 (二进制) 022 000 010 010 (二进制) ~022 111 101 101 (二进制按位取反) 666 ~022 110 100 100 644 ✓ 目录起始 777umask 022 777 111 111 111 022 000 010 010 ~022 111 101 101 777 ~022 111 101 101 755 ✓注意umask 的计算是位运算不是简单的减法。大多数情况下减法结果一样但某些特殊值如 umask023会有差异umask023文件权限 错误算法666 - 023 643rw-r---wx❌ 正确算法666 ~023 644rw-r--r--✓③ 临时修改 umask# 把 umask 改为 0077只有拥有者有权限组和其他人完全无权 $ umask 0077 $ umask 0077 # 此时新建文件的权限 $ touch private.txt $ ls -l private.txt -rw------- 1 alice alice 0 Sep 24 22:10 private.txt # 权限 600666 ~077 600✓ # 注意umask 修改只在当前 Shell 会话有效退出后恢复默认延伸扩展1. 如何永久修改 umask临时修改只对当前 Shell 有效。如需永久修改# 修改当前用户的 umask写入 ~/.bashrc echo umask 027 ~/.bashrc source ~/.bashrc # 修改系统全局 umask影响所有用户需 root # 编辑 /etc/profile 或 /etc/login.defs sudo vim /etc/profile # 在文件中找到 umask 行改为 umask 0272. 常见 umask 值及其适用场景umask文件默认目录默认适用场景022644755最常用默认值平衡安全与便利027640750更严格组外用户无任何权限077600700最严格只有拥有者有权限002664775团队协作环境组成员也有写权限六、特殊权限SUID / SGID / Sticky Bit除了标准的rwx权限Linux 还有三个特殊权限位它们会改变权限检查的行为。6.1 SUIDSet User ID语法形式chmod us 可执行文件 # 设置 SUID chmod 4权限 文件 # 数字模式4 代表 SUID chmod u-s 文件 # 取消 SUID功能说明SUID 只对可执行文件有效。设置了 SUID 后无论谁执行这个程序程序都会以文件拥有者的身份运行。经典例子passwd命令$ ls -l /usr/bin/passwd -rwsr-xr-x 1 root root 68208 Mar 14 2022 /usr/bin/passwd # ↑ 这个 s 就是 SUID 标志普通用户alice执行passwd修改自己的密码时需要写入/etc/shadow文件这个文件只有 root 能写。但因为passwd有 SUIDalice 执行passwd时进程的实际有效用户 ID 变成了root所以才能写入/etc/shadow。代码示例# 查看系统中的 SUID 程序 $ find /usr/bin -perm -4000 -type f 2/dev/null /usr/bin/passwd /usr/bin/sudo /usr/bin/su # 这些程序都需要以 root 身份运行部分操作 # SUID 在 ls -l 中的显示 $ ls -l /usr/bin/passwd -rwsr-xr-x 1 root root ... # ↑ User 的 x 位显示为 s小写 SUID 生效 # 如果 User 本身没有 x 权限会显示为大写 S无效状态延伸扩展⚠️SUID 是双刃剑SUID 让普通用户能以高权限执行程序如果被恶意利用就是提权漏洞。安全原则不要随意给程序设置 SUID定期检查系统中的 SUID 文件find / -perm -4000 -type f 2/dev/null重点排查不属于系统默认、但是有 SUID 的程序6.2 SGIDSet Group ID语法形式chmod gs 目录或文件 # 设置 SGID chmod 2权限 文件 # 数字模式2 代表 SGID chmod g-s 文件 # 取消 SGID功能说明SGID 有两种作用① 对可执行文件类似 SUID执行时以文件所属组的身份运行不常用② 对目录常用在该目录下创建的新文件/子目录会自动继承该目录的所属组而不是创建者自己的默认组这是团队协作目录的最佳实践代码示例6.3 Sticky Bit粘滞位语法形式chmod t 目录 # 设置 Sticky Bit chmod 1权限 目录 # 数字模式1 代表 Sticky Bit chmod -t 目录 # 取消 Sticky Bit功能说明Sticky Bit 只对目录有效。设置了 Sticky Bit 的目录中即使用户对目录有写权限w也只能删除自己创建的文件不能删除别人的文件。经典例子/tmp目录$ ls -ld /tmp drwxrwxrwt 15 root root 4096 Sep 24 22:40 /tmp/ # ↑ 最后的 t 就是 Sticky Bit 标志/tmp是系统临时文件目录权限是 777所有人可读写但有了 Sticky Bit你只能删除自己创建的文件不能删除别人的临时文件。代码示例# 创建一个公共上传目录设置粘滞位 sudo mkdir /data/uploads sudo chmod 1777 /data/uploads $ ls -ld /data/uploads drwxrwxrwt 2 root root 4096 Sep 24 22:45 /data/uploads/ # ↑ Others 的 x 位显示为 t Sticky Bit 生效 # 测试alice 创建文件bob 尝试删除 $ su - alice $ touch /data/uploads/alice_file.txt $ su - bob $ rm /data/uploads/alice_file.txt rm: cannot remove /data/uploads/alice_file.txt: Operation not permitted # ✅ bob 无法删除 alice 的文件延伸扩展小写 t 和大写 T 的区别小写tSticky Bit 生效目录同时有x权限大写TSticky Bit 已设置但目录没有x权限实际上不生效$ chmod 1666 bad_dir $ ls -ld bad_dir drw-rw-rwT 2 root root 4096 ... # 大写 T 无效七、新手常见问题速查Q1执行脚本时报Permission denied怎么办原因脚本文件没有执行x权限。解决chmod x your_script.sh ./your_script.shQ2chown时报Operation not permitted怎么办原因chown需要 root 权限普通用户不能执行。解决sudo chown alice:alice myfile.txtQ3新建文件的默认权限是什么为什么是 644原因由umask决定。默认umask022时文件666 ~022 644rw-r--r--目录777 ~022 755rwxr-xr-x修改默认权限umask 027 # 改为更严格的默认权限Q4为什么我对文件有r权限但cat文件时还是Permission denied原因你可能没有目录的x权限访问文件需要先进入目录x权限才能访问目录里的文件。解决给目录加上执行权限chmod x /path/to/directoryQ5特殊权限的数字是怎么算的特殊权限数字写法示例SUID4chmod 4755 fileSGID2chmod 2755 dirSticky Bit1chmod 1777 dir数字写法是把特殊权限数字放在普通权限数字的前面如4755 SUID(4) 755。总结恭喜你读完了本文 让我们用一张表回顾所有核心知识点命令/概念作用常用示例注意事项ls -l查看文件权限信息ls -l第一列是权限字符串chmod修改文件/目录权限chmod 755 file拥有者自己就能改chown修改文件拥有者可同时改组sudo chown alice:devs file只有 root 能执行chgrp修改文件所属组sudo chgrp devs file也可用chown :devsumask控制新文件的默认权限umask 022修改后只对当前 Shell 有效SUID执行时以文件拥有者身份运行chmod 4755 /usr/bin/passwd有安全风险谨慎使用SGID目录下新文件自动继承组chmod 2775 /data/shared团队协作目录必备Sticky Bit只能删除自己的文件chmod 1777 /tmp公共目录必备权限数字速查表数字权限用途644rw-r--r--普通文件默认值755rwxr-xr-x可执行文件 / 目录默认值600rw-------私密文件SSH密钥等700rwx------私密目录777rwxrwxrwx⚠️ 所有人全权限慎用下一篇预告《Linux 文本编辑器 Vim 从入门到实用》—— 再也不用担心怎么退出 Vim了如果本文对你有帮助欢迎点赞 收藏 ⭐ 关注 ➕有任何问题欢迎在评论区留言博主会及时回复 关注我持续更新「从零开始学习 Linux」系列教程