在 Linux 世界里,有句广为流传的话:“权限决定一切”。
小到新建一个文件、查看一份日志,大到管理服务器、部署核心业务,权限始终是绕不开的核心知识点 —— 它不仅是服务器安全的 “第一道防线”,更是 Linux 面试的高频考点,甚至很多运维事故的根源,都能追溯到 “权限配置不当”。
今天这篇文章,就从基础到实战,把 Linux 权限的核心知识点拆解得明明白白:不管你是刚入门的新手,还是需要巩固知识的从业者,读完都能彻底吃透权限逻辑,上手实操不踩坑。
简单说,权限就是 “规定某个用户 / 用户组,能对某个文件 / 目录做什么操作” 的规则。
Linux 是多用户、多任务操作系统,一台服务器上可能同时有管理员、开发、测试等多个角色在用:比如开发需要修改代码文件,测试只能查看日志,普通用户不能接触核心配置 —— 权限的本质,就是给不同角色 “划边界”,避免越权操作。
这里要记住 Linux 的一个核心原则:一切皆文件。不管是我们看到的文档、脚本,还是文件夹、硬件设备(比如硬盘、打印机),在 Linux 中都被视为 “文件”。所以我们讨论的 “权限”,本质上都是对 “文件(含目录)” 的操作权限。
不懂权限的 Linux 使用者,就像拿着钥匙却不知道哪扇门能开 —— 要么误操作删了核心文件,要么被权限限制寸步难行,甚至给服务器留下安全漏洞。具体来说,权限的作用有 4 点:
保护数据安全:防止误删、篡改关键文件(比如 /etc/passwd 用户配置文件、数据库备份);
明确职责分工:开发能写代码、测试能查日志、运维能管配置,各司其职不越界;
抵御外部攻击:即使黑客入侵普通用户账号,也能通过权限限制,阻止其获取 root 级核心权限;
避免内部混乱:多人共用服务器时,防止用户意外修改他人文件,导致业务异常。
举个真实案例:某公司测试人员误删了生产环境的日志文件,排查后发现是日志目录给了 “其他用户” 写权限 —— 如果一开始就配置合理权限,这类事故完全可以避免。
要理解权限,先记住三个核心概念:权限对象、权限类型、权限标识,三者结合才能完整描述 “谁能做什么”。
Linux 中,文件的 “权限对象” 分为三类,覆盖所有用户场景:
✅属主(user,简称 u):文件的创建者或拥有者(比如你新建的文件,默认你就是属主);
✅属组(group,简称 g):文件所属的用户组(比如把项目文件归到 “dev” 组,组内成员都能按权限操作);
✅其他用户(other,简称 o):除了属主和属组之外的所有用户(相当于 “公共权限”);
✅所有人(all,简称 a):包含 u、g、o 三类对象(快速给所有用户统一设置权限时用)。
用ll命令(ls -l的简写)就能查看文件的权限对象:
[root@localhost ~]# ll abc.txt-rw-r--r--. 1 root root 0 12月 30 10:00 abc.txt
这里的`root root`,第一个是属主,第二个是属组。
权限类型分 3 种,分别对应 “读、写、执行”,但对 “文件” 和 “目录” 的含义完全不同,这是新手最容易混淆的点,一定要记牢:
⚠️ 关键提醒:
📍目录的 “写权限” 风险极高!如果给普通用户目录的 w 权限,他能删除目录内所有文件(包括别人创建的);
📍文件默认没有执行权限(安全考虑),需要手动添加(比如脚本文件)。
用ll命令查看时,权限部分会显示成一串字符(比如rwxrw-rwx),拆解后一目了然:
每三位对应一个权限对象,分别由`r(读)、w(写)、x(执行)、-(无权限)`组成:
✅ `rw-`:属主有读、写权限,无执行权限;
✅`r--`:属组只有读权限;
✅ `r--`:其他用户只有读权限。
除了字符标识,Linux 还支持数字标识(更简洁,实操常用):
✅r=4,w=2,x=1,-=0;
✅每个权限对象的权限值 = 对应权限的数字和(比如rw-=4+2=6,r-x=4+1=5)。
常见权限组合(记熟能提高工作效率):
✅文件常用`644`:属主 rw-(6),属组 r--(4),其他 r--(4)(默认安全权限);
✅目录常用`755`:属主 rwx(7),属组 r-x(5),其他 r-x(5)(能进入、查看,不能修改);
✅脚本常用`700`:只有属主有 rwx 权限(防止别人篡改或执行)。
看懂权限后,核心是学会 “修改权限”,这 3 个命令是运维日常高频操作,必须练熟!
`chmod`(change mode)用于修改权限,支持 “字符模式” 和 “数字模式”,按需选择:
语法:`chmod [选项] 权限模式 文件名/目录`
✅选项`-R`:递归修改(给目录设置权限时必须加,否则只改目录本身,子文件 / 目录不变);
✅权限模式:`对象+操作+权限`(比如`u+x`= 给属主加执行权限)。
操作符说明
✅`+`:添加权限;
✅`-`:移除权限;
✅`=`:覆盖权限(之前的权限全部失效)。
实操案例(跟着练!):
# 1. 给abc.txt属主加执行权限(u+x)[root@localhost ~]# chmod u+x abc.txt# 结果:rw-r--r-- → rwxr--r--# 2. 给abc.txt属组加写权限,给其他用户移除读权限(g+w, o-r)[root@localhost ~]# chmod g+w, o-r abc.txt# 结果:rwxr--r-- → rwxrw----# 3. 给test目录及子内容递归设置:所有人读+执行(a+rx)
语法:`chmod [选项] 数字权限 文件名/目录`
▪️数字权限:三位数字,分别对应 “属主、属组、其他用户”(比如755= 属主 7,属组 5,其他 5)。
实操案例:
# 1. 设置abc.txt为644(文件默认安全权限)[root@localhost ~]# chmod 644 abc.txt# 2. 设置test目录为755(目录默认权限)[root@localhost ~]# chmod 755 test/# 3. 设置脚本文件为700(仅属主可执行)[root@localhost ~]# chmod 700 run.sh
`chown`(change owner)可同时修改属主和属组,语法:
chown [-R] 新属主[:新属组] 文件名/目录
案例:
# 1. 把abc.txt的属主改成zhangsan[root@localhost ~]# chown zhangsan abc.txt# 2. 把test目录的属主改成lisi,属组改成dev(递归生效)[root@localhost ~]# chown -R lisi:dev test/
`chgrp`(change group)专门修改属组,语法更简单:
chgrp [-R] 新属组 文件名/目录
案例:
# 把abc.txt的属组改成test组[root@localhost ~]# chgrp test abc.txt
⚠️ 注意:只有 root 用户能修改别人创建文件的属主 / 属组,普通用户只能修改自己的文件。
基础权限能满足日常需求,但有些特殊场景(比如让普通用户改密码、团队共享目录)需要 “特殊权限”—— 这三个权限是面试高频考点,也是实操难点,拆解如下:
✅标识:属主的 x 位变成`s`(若属主无 x 权限则为`S`);
✅数字标识:4(比如`4755`=SETUID+755);
✅适用对象:可执行文件 / 命令(不能给目录设);
✅核心作用:让普通用户执行文件时,临时拥有文件属主的权限。
经典案例:passwd命令
普通用户能修改自己的密码,本质是passwd命令设置了 SETUID:
[root@localhost ~]# ll /usr/bin/passwd-rwsr-xr-x. 1 root root 27832 6月 10 2024 /usr/bin/passwd
▪️`rws`中的`s`就是 SETUID 标识;
▪️密码存储在`/etc/shadow`(默认无任何普通用户权限),但普通用户执行`passwd`时,会临时获得 root 权限,从而修改文件。
⚠️ 风险提醒:SETUID 权限很危险!若给`rm`这类命令设 SETUID,普通用户能删除 root 的文件,尽量少用。
✅标识:属组的 x 位变成`s`(若属组无 x 权限则为`S`);
✅数字标识:2(比如`2755`=SETGID+755);
✅适用对象:目录(文件设了没用);
✅核心作用:目录下新建的文件 / 子目录,会自动继承父目录的属组(团队协作必备)。
实操案例(团队共享目录):
# 1. 创建dev共享目录,属组设为dev组[root@localhost ~]# mkdir /home/dev_shared[root@localhost ~]# chgrp dev /home/dev_shared# 2. 给目录设SETGID(2755)[root@localhost ~]# chmod 2755 /home/dev_shared# 3. 任何用户在该目录新建文件,属组都会是dev(而非创建者的属组)[zhangsan@localhost ~]$ touch /home/dev_shared/test.txt[zhangsan@localhost ~]$ ll /home/dev_shared/test.txt-rw-r--r--. 1 zhangsan dev 0 12月 30 11:00 test.txt
✅标识:其他用户的 x 位变成`t`(若其他用户无 x 权限则为`T`);
✅数字标识:1(比如`1777`= 粘滞位 + 777);
✅适用对象:开放写权限的目录(比如`/tmp`);
✅核心作用:用户只能删除自己创建的文件,不能删别人的(解决共享目录 “误删” 问题)。
最典型的案例:系统默认目录/tmp
[root@localhost ~]# ll -d /tmpdrwxrwxrwt. 7 root root 110 12月 30 09:00 /tmp
▪️`rwt`中的`t`就是粘滞位标识;
▪️任何用户都能在`/tmp`新建文件,但只能删自己的,不能删别人的(比如 zhangsan 不能删 lisi 创建的文件)。
实操案例(创建公共上传目录):
# 1. 创建public目录,给所有人读+写+执行权限(777)[root@localhost ~]# mkdir /home/public[root@localhost ~]# chmod 777 /home/public# 2. 给目录加粘滞位(1777)[root@localhost ~]# chmod 1777 /home/public
基础权限只能给 “属主、属组、其他” 三类对象设权限,但实际场景中可能需要 “给某个特定用户单独设权限”—— 这时候就需要扩展权限:ACL 和 chattr。
ACL(Access Control List)突破了 “三类对象” 的限制,能给单个用户、单个组单独设置权限,比如 “给市场部新员工小明设置只读权限,不给写权限”。
✅`getfacl 文件名`:查看 ACL 权限;
✅`setfacl [选项] 权限模式 文件名`:设置 ACL 权限。
实操案例:
# 1. 给用户xiaoming设置abc.txt的只读权限(u:用户名:权限)[root@localhost ~]# setfacl -m u:xiaoming:r abc.txt# 2. 给用户组market设置test目录的读+执行权限(g:组名:权限)[root@localhost ~]# setfacl -R -m g:market:rx test/# 3. 查看ACL权限(权限列会多一个+号)[root@localhost ~]# ll abc.txt-rw-r--r--+ 1 root root 0 12月 30 10:00 abc.txt[root@localhost ~]# getfacl abc.txt# file: abc.txt# owner: root# group: rootuser::rw-user:xiaoming:r-- # 单独给xiaoming的权限group::r--mask::r--other::r--# 4. 删除ACL权限(删除xiaoming的权限)[root@localhost ~]# setfacl -x u:xiaoming abc.txt# 5. 清空所有ACL权限[root@localhost ~]# setfacl -b abc.txt
chattr 能设置文件的 “扩展属性”,比基础权限更严格 —— 比如让文件 “不可修改、不可删除”,即使是 root 用户也需要先取消属性才能操作(适合保护核心配置文件)。
✅`+i`:文件不可变(不能修改、删除、重命名,root 也不行);
✅`+a`:文件只能追加内容(不能修改原有内容,适合日志文件)。
实操案例:
# 1. 给/etc/passwd设不可变属性(防止被篡改)[root@localhost ~]# chattr +i /etc/passwd# 2. 尝试修改文件(失败)[root@localhost ~]# echo "test" >> /etc/passwd-bash: /etc/passwd: Operation not permitted# 3. 取消不可变属性(需要时)[root@localhost ~]# chattr -i /etc/passwd# 4. 给日志文件设只追加属性[root@localhost ~]# chattr +a /var/log/messages# 只能用>>追加内容,不能用>覆盖[root@localhost ~]# echo "new log" >> /var/log/messages # 成功[root@localhost ~]# echo "overwrite" > /var/log/messages # 失败
你有没有发现:新建的文件默认权限是`644`,目录是`755`?这不是随机的,而是由`umask`(权限掩码)决定的。
umask 是 “默认权限掩码”,用于限制新建文件 / 目录的初始权限 —— 系统会用 “最大默认权限” 减去 umask 值,得到最终的默认权限。
✅文件的最大默认权限:`666`(默认没有执行权限,安全考虑);
✅目录的最大默认权限:`777`(目录需要执行权限才能进入);
✅root 用户默认 umask:`022`;普通用户默认 umask:`002`。
计算逻辑:最大权限 - umask 值 = 默认权限(用字符权限减,不是数字直接减!)
✅root 用户新建文件:666(rw-rw-rw-) - 022(---w--w-) = 644(rw-r--r--);
✅普通用户新建文件:666(rw-rw-rw-) - 002(------w-) = 664(rw-rw-r--);
✅root 用户新建目录:777(rwxrwxrwx) - 022(---w--w-) = 755(rwxr-xr-x)。
# 1. 临时修改(仅当前终端生效)[root@localhost ~]# umask 007 # root新建文件默认权限变成660,目录770# 2. 永久修改(对所有用户生效)[root@localhost ~]# vim /etc/bashrc# 在文件末尾添加:umask 007# 生效:[root@localhost ~]# source /etc/bashrc# 3. 永久修改(仅对当前用户生效)[root@localhost ~]# vim ~/.bashrc# 添加:umask 007# 生效:source ~/.bashrc
sudo 命令:普通用户的 “临时 root 权限”
默认情况下,普通用户不能执行`rm -rf /`、`chown`等 root 级命令,但实际工作中又需要让普通用户做一些管理操作 —— 这时候`sudo`就派上用场了。
✅`su`:切换到 root 用户,需要知道 root 密码(风险高,不推荐);
✅`sudo`:普通用户用自己的密码,临时执行 root 级命令(可精准授权,推荐)。
核心配置
/etc/sudoers(必须用 visudo 编辑)
`sudo`的授权规则存在`/etc/sudoers`文件中,必须用 visudo 命令编辑(会自动检查语法,避免写错导致 sudo 失效)。
常见授权案例:
# 1. 允许用户zhangsan执行所有root命令(需要输zhangsan的密码)[root@localhost ~]# visudo# 添加一行:zhangsan ALL=(ALL) ALL# 2. 允许zhangsan免密码执行所有命令(无需输密码)zhangsan ALL=(ALL) NOPASSWD: ALL# 3. 允许zhangsan执行所有命令,但禁止危险命令(如rm)zhangsan ALL=(ALL) NOPASSWD: ALL, !/usr/bin/rm# 4. 允许dev组所有用户免密码执行所有命令%dev ALL=(ALL) NOPASSWD: ALL
常用 sudo 命令:
# 1. 查看当前用户的sudo授权[zhangsan@localhost ~]$ sudo -l# 2. 用root权限执行命令(如查看/root目录)[zhangsan@localhost ~]$ sudo ls /root# 3. 取消sudo密码缓存(默认输一次密码后,5分钟内不用再输)[zhangsan@localhost ~]$ sudo -k
关键看文件所在目录的权限!如果目录没有写权限,即使你是文件所有者,也不能用`wq!`强制保存(之前很多教程说 “所有者能强制保存” 是错误的)。
777意味着 “所有人能读、写、执行”,若给核心文件(如数据库配置)设 777,黑客能轻松篡改,风险极高。
给`rm`、`mv`等命令设 SETUID,普通用户能删除 root 文件;给非共享目录设粘滞位,完全没用。
给文件设了 ACL 后,用`ll`看不到具体权限,一定要用`getfacl`查看,不用时及时用`setfacl -b`清空。
Linux 权限的本质是 “边界控制”—— 记住 “谁(对象)- 能做什么(权限类型)- 怎么设置(命令)” 的逻辑,再结合实操练习,就能彻底掌握。
✅基础权限:`chmod`(改权限)、`chown`(改属主)、`chgrp`(改属组);
✅特殊权限:SETUID(4)、SETGID(2)、粘滞位(1)(数字叠加在基础权限前,如 4755);
✅扩展权限:ACL(精细化授权)、chattr(终极保护);
✅默认权限:umask(root=022,普通用户 = 002);
✅临时授权:sudo(精准控制普通用户权限)。
权限学习没有捷径,最好的方法是 “边看边练”—— 把文中的案例在虚拟机里实操一遍,遇到问题排查解决,慢慢就会形成肌肉记忆。
如果觉得这篇文章有用,欢迎点赞、收藏、转发给需要的朋友~ 你在权限操作中遇到过哪些坑?评论区留言交流!