前言
Linux 是一个多用户操作系统,权限体系是它安全机制的核心。服务器上多人协作、程序运行、文件访问控制,全都依赖用户、用户组和文件权限这套体系。很多新手在部署项目、启动服务、访问日志时经常遇到 Permission denied,本质都是权限没有理清楚。今天我们系统梳理 Linux 用户、用户组、文件权限、特殊权限以及权限修改实操。
一、用户与用户组基础
1. 用户是什么
Linux 下每个登录操作系统、执行程序的主体都是用户,每个用户都有唯一标识:UID(用户ID)。
root:超级管理员,UID=0,拥有系统最高权限,可以做任何操作- 普通用户:手动创建,UID一般从1000开始,权限受限,只能操作自己有权限的文件
- 系统用户:给服务使用(nginx、mysql、www),一般不允许登录服务器,UID通常1~999
查看当前登录用户:
bash
whoami
查看系统所有用户:
bash
cat /etc/passwd
/etc/passwd 存储用户基础信息,每行格式:用户名:密码占位符:UID:GID:注释:家目录:登录shell
2. 用户组是什么
用户组(group)是用户的集合,方便批量授权。一个用户必须属于一个主组,同时可以加入多个附加组。
- GID:用户组ID
- 配置文件:
/etc/group
查看所有用户组:
bash
cat /etc/group
查看某个用户属于哪些组:
bash
id username
3. 用户、用户组常用命令
用户操作
bash
# 创建用户,自动创建同名组和家目录
useradd testuser
# 设置密码
passwd testuser
# 删除用户(-r 同时删除家目录和邮件)
userdel -r testuser
# 修改用户信息,比如修改用户名、附加组
usermod
用户组操作
bash
# 创建用户组
groupadd dev
# 删除用户组
groupdel dev
# 将用户加入附加组
usermod -aG dev testuser
# 把用户从组移除
gpasswd -d testuser dev
重点:
usermod -aG的-a不能丢,不加-a会覆盖原有附加组!
二、Linux 文件基础权限
执行 ls -l 我们就能看到文件权限字符串,示例:
bash
-rw-r--r-- 1 root root 123 Oct 25 10:00 test.txt
第一位:文件类型
-普通文件d目录l软链接b块设备、c字符设备
后面9位,分成3组,每组3位:属主权限 | 属组权限 | 其他用户权限
每组顺序固定:r 读 w 写 x 执行
| 符号 | 含义 | 文件 | 目录 |
|---|---|---|---|
| r | read 读 | 读取文件内容 | 列出目录里面的文件(ls) |
| w | write 写 | 修改、覆盖文件 | 在目录新建、删除、重命名文件 |
| x | execute 执行 | 可以运行脚本/程序 | 进入目录(cd) |
非常容易踩坑:目录必须有x权限才能cd进去,只有r没有x,只能看文件名,无法访问里面内容;目录的w权限可以删除里面文件,哪怕文件本身没有写权限!
数字权限(八进制权限,运维最常用)
r=4,w=2,x=1,权限相加得到数字:
- rwx = 4+2+1 = 7
- rw- = 4+2 = 6
- r-- = 4
- --- = 0
常见权限组合:
644:文件默认推荐,属主读写,组和其他只读-rw-r--r--755:目录/脚本推荐,属主读写执行,组和其他读、执行drwxr-xr-x700:私密文件目录,仅属主可访问
修改权限 chmod
两种写法:符号模式 / 数字模式
bash
# 数字方式(推荐)
chmod 644 test.txt
chmod 755 mydir
# 符号方式
# u属主 g属组 o其他 a全部
chmod u+x test.sh
chmod g-w test.txt
chmod a-r test.txt
# 递归修改目录下所有文件权限(-R)
chmod -R 755 mydir/
修改属主、属组 chown
chown 用来改变文件属于哪个用户、哪个组
bash
# 修改属主
chown testuser test.txt
# 同时修改属主和属组
chown testuser:dev test.txt
# 递归修改目录
chown -R testuser:dev mydir/
三、三个特殊权限(SUID、SGID、Sticky位)
普通rwx之外还有3个高级权限,生产场景偶尔会用到
- SUID(4000) :文件执行时,以文件属主身份 运行,不是执行者身份
- 典型例子
/usr/bin/passwd,普通用户可以改密码,本质就是SUID - 只对二进制程序生效,脚本无效
- 典型例子
- SGID(2000)
- 文件:同SUID,以属组身份运行
- 目录:在这个目录新建文件,自动继承目录的属组(团队共享目录很适合)
- Sticky 粘滞位(1000) :目录开启后,用户只能删除自己创建的文件
- 典型目录
/tmp,所有人都能读写,但不能删别人的临时文件 - 标识:权限最后一位变成t,如
drwxrwxrwt
- 典型目录
设置特殊权限示例:
bash
chmod 4755 file # SUID
chmod 2755 dir # SGID
chmod 1777 /tmp # Sticky
四、默认权限:umask
新建文件、目录不会直接是777,由umask掩码控制默认权限
- 目录原始最大权限 777
- 文件原始最大权限 666(默认新建文件没有执行权限,安全)
- 最终权限 = 原始权限 - umask
查看umask:
bash
umask
一般服务器默认 022
- 目录:777 - 022 = 755
- 文件:666 - 022 = 644
注意:umask是掩码,不是简单减法,是位运算,记住常用022、002即可。
五、实操避坑&常见问题
Permission denied排查思路
① 先看文件属主属组ls -l
② 检查上级目录权限(能不能cd进去,有没有x权限!很多人忽略)
③ 确认当前用户是否在目标用户组里- 不要随便给777权限!777代表所有人可读可写可执行,线上服务器尽量避免,安全风险极高
- chmod -R、chown -R 慎用,递归操作改错会大面积破坏系统权限
- 普通用户修改自己密码不需要root,修改别人密码必须root
六、小结
简单总结这套关系:
- 用户:登录身份,UID标识
- 用户组:批量管理一组用户,GID标识
- 文件权限:分三块(u/g/o),rwx控制读写执行
- chmod改权限,chown改归属,umask控制新建文件默认权限
- SUID/SGID/Sticky是进阶特殊权限,适合共享目录、特殊程序场景
Linux权限没有想象复杂,但非常严谨。掌握这套体系,排查日志、部署项目、搭建共享目录、服务权限报错基本都能独立解决。