☰
Linux用户权限管理实战:门禁系统比喻讲透chmod与用户组
2026/10/11 6:45:56 网站建设 项目流程

搞服务器的人都会有一个共同的经历:刚摸到Linux命令行的前两周,干得最多的事就是被Permission Denied教育做人。你明明觉得自己操作没问题,系统偏不让你做,还摆出一副理所当然的表情。其实Linux这层权限机制一点不复杂,你把它想成公司大楼的门禁系统,一下就通了。

这篇文章就是Linux入门实战的第二篇,专注讲透用户权限管理这件事。你不需要懂什么底层内核原理,我直接用门禁系统的逻辑给你拆明白:用户是什么、组是什么、rwx这九个位到底在锁什么、chmod和chown这些命令背后的真实含义是什么。看完之后,你至少能独立完成开账号、配组、分权限这一整套日常工作,也够应对常见的面试题。

如果你是一个刚接触Linux的运维新人、准备转行做服务器的开发者,或者正被权限报错折磨的学生,这篇文章就是给你写的。

1. 把Linux权限体系当成一套门禁系统来认识

门禁系统你应该不陌生:一张卡片对应一个人的身份,门禁主机根据卡里的信息判断你能进哪栋楼、进哪层、哪个房间。Linux的权限管理本质上就是这套逻辑,只不过把“人”换成了“用户”,把“房间门”换成了“文件”和“目录”。

1.1 门禁卡、登记表和管理员,三位一体

看Linux系统里的用户体系,其实就和物业的登记信息一一对应:

  • /etc/passwd:门禁登记表,记录所有合法用户的账号名、UID、主目录、默认Shell这些基本信息。
  • /etc/shadow:物业保险柜里的密码本,只有root能看,存的是密码哈希和密码过期策略。
  • root用户:物业经理,整个大楼的最高权限,所有门禁规则对他不生效。

你每次执行ls -l,命令输出的那一长串信息,其实就是这套门禁系统贴在每个房间门口的门禁规则:哪个业主(属主)、哪个物业团队(属组)、其他无关人员(其他用户)分别能对这个房间做什么操作。

我见过很多新手一上来就背chmod 755、chmod 644,背得滚瓜烂熟但完全不知道这几个数字在干嘛。这很危险,因为一旦遇到需要组合授权的情况,背数字是救不了你的。只有理解了门禁这套底层逻辑,权限才会从“背出来的参数”变成“推导出来的答案”。

1.2 为什么Linux非要搞这么一套门禁

有人会问:Windows这么多年不也活得好好的吗?单机用户只要一个管理员账号不就行了?但Linux从诞生那天起就是多用户、多任务操作系统,一台服务器上同时跑着几十个关联进程和账户太正常了。

你想想:一台线上服务器,运维同学要管服务,开发同学要改代码,数据库管理员要维护数据,审计人员要看日志。如果所有人都能用同一个root账号操作,一个误删数据就能把整个系统端掉。门禁系统存在的意义,就是把“谁在什么时间能做什么事”严格限制住,出事的时候能查到人,更重要的是让普通人没有机会犯错。

这套机制同时也在保护普通用户自己:你在/tmp目录里建了一个临时文件,如果没有权限隔离,隔壁用户就能随便改你的工作成果,那整个系统就成了公共厕所。

2. 用户管理实操:创建、改密、临时冻结

先做一套完整的用户管理实操,用门禁的视角把每个命令都过一遍。这里我新建的场景是:公司来了一个实习生叫xiaoming,我需要给他开通Linux服务器账号。

2.1 useradd:给新人制作门禁卡

最简单的创建命令是这样的:

useradd xiaoming

但我不建议你这样直接生产环境操作,因为这样创建的账号默认没有主目录、没有初始化Shell环境,登录进去会一脸懵。标准化一点的做法是这样:

useradd -m -s /bin/bash -c "DevOps Intern" xiaoming
  • -m:自动创建用户主目录,也就是/home/xiaoming。
  • -s /bin/bash:指定登录Shell。Linux的Shell就像你进楼之后用的操作面板,不指定的话可能会被分配一个nologin,导致用户没办法正常登录操作。
  • -c "DevOps Intern":写入备注信息,相当于门禁卡上印一个职位标签,方便后面同事查看。

你可以顺手看一下/etc/passwd文件末尾,会发现多了一行:

xiaoming:x:1001:1001:DevOps Intern:/home/xiaoming:/bin/bash

这一行从左到右分别是:用户名、密码占位(真正的密码在shadow里)、UID、GID、备注、主目录、Shell。系统给xiaoming分配的UID是1001,是因为前面已经把1000让给了第一个普通用户,Linux的普通用户默认从1000开始编号,这就是门禁卡上的编号规则。

2.2 passwd:给门禁卡设一个开门密码

账号创建好之后,开机密码还没设置:

passwd xiaoming

这个命令会引导你交互式输入两遍密码。需要注意,Linux输入密码时屏幕上什么都不显示,这是正常的,别以为键盘坏了。

如果是脚本里批量初始化密码,可以用非交互形式:

echo "Xiaoming@2026" | passwd --stdin xiaoming

--stdin这个选项可以让passwd从标准输入读取密码,适合自动化场景。但一般在干净的生产环境,我仍然建议交互式设置,避免Shell历史记录里留下密码痕迹。

还有一件事很难记,但面试和实操都常考:密码过期策略。默认情况下,所有用户的密码是永不过期的。但公司安全制度一般要求90天换一次,这个需求要用chage来完成:

chage -M 90 -W 7 xiaoming

-M表示密码最长有效天数,-W表示密码过期前多少天开始提醒。过了90天不换密码,xiaoming的账号就会被锁住,登录时提示密码过期必须修改。这个细节就是我在项目里被问过的“Linux密码过期提醒通知”的实际落地方式。

如果要临时冻结账号、不删除资料,用usermod加锁比较方便:

usermod -L xiaoming

解锁则用:

usermod -U xiaoming

这就相当于把门禁卡临时禁用,但是卡的信息还在,想用的时候重新激活就行。相比userdel直接删账号,这种做法的好处是保留用户的历史文件和定时任务,适合处理离职员工账期的过渡期。

2.3 usermod和userdel:改卡、销卡

改卡主要用usermod,最常见的几个场景:

usermod -l newname xiaoming # 变更用户名 usermod -d /home/newhome xiaoming # 变更主目录 usermod -e 2026-12-31 xiaoming # 设定账号到期日期

注意-l改用户名不影响UID,所以他之前拥有的文件依然归他所有,因为系统识别身份靠的是UID而不是登录名。这一点很多人不知道,经常拿ls -l一看文件属性没变,以为出Bug了。

销卡就是userdel:

userdel xiaoming userdel -r xiaoming

-r参数会连同主目录和邮件池一起删掉。生产环境删账号前一定要确认该用户名下有哪些文件,别直接-r完事,不然同事要用到他之前留的文件时,你已经哭不出来了。稳妥的做法是先找出他名下的所有文件:

find / -user xiaoming -ls 2>/dev/null

把文件先归档或者转给其他人,再考虑删不删账号。

3. 用户组:给门禁卡按角色分级

单打独斗的用户权限是管理不过来的。你想想,一个项目组五个人,每个人都要读同一批配置文件,给每个人重复授权显然疯了。有了组,就可以把门禁授权做成一键配置。

3.1 组就是同一批门禁卡的复用模板

每个用户创建时都会被分配一个同名的主组,这个组在/etc/group里记录着。查看一个用户属于哪些组,用id命令一次看全:

id xiaoming

输出大概长这样:

uid=1001(xiaoming) gid=1001(xiaoming) groups=1001(xiaoming)

gid是主组,groups是包含的所有组。Linux用户组分为主组(primary group)和附加组(secondary group),主组决定用户新建文件的默认属组,附加组决定用户还能访问哪些额外资源。这就是门禁系统里的“一张卡刷多个区域的权限”。

如果我要给xiaoming开通sudo权限,最干净的做法不是直接去改sudoers(新人很容易改错),而是把他加到wheel这个组里:

usermod -aG wheel xiaoming

-aG两个参数要连在一起写,-g是覆盖主组,-G是操作附加组,-a是追加。漏了-a就会把用户从所有其他附加组里踢出去,这个坑我踩过,真实写照:本意是给用户加一个docker组权限,结果把他从devops组里清了出去,线上服务直接挂了一下午。

3.2 创建组和指定组成员

创建组用groupadd:

groupadd devops

给devops组添加或移除成员,可以用gpasswd:

gpasswd -a xiaoming devops gpasswd -d xiaoming devops

把主组改成devops,用usermod -g:

usermod -g devops xiaoming

要查询一个组下面有哪些成员,直接看/etc/group文件:

grep devops /etc/group

输出末尾冒号后面就是组成员列表,用逗号分隔。

3.3 组管理的场景:一个共享工作目录

组管理最常见的场景是做共享目录。假设devops小组五个人要共用/mnt/devops-sharing目录,正确姿势是这样:

mkdir -p /mnt/devops-sharing chown root:devops /mnt/devops-sharing chmod 770 /mnt/devops-sharing

770的含义我在下一节详细拆,这里你先记住:属主(root)和属组(devops)的成员有完全权限,其他用户无权访问。创建好之后,devops组成员都能读写这个目录,非组成员会被拒绝。这就省去了给五个人分别授权的麻烦,也符合最小权限的原则。

4. 权限位的门禁本质:rwx到底在锁什么

接下来是全文的核心,也是面试和日常操作最高频的部分:那九个权限位。

4.1 三个身份、三种权限,交叉组合

用ls -l查看一个文件,输出长这样:

-rw-r--r--. 1 root root 1234 Jan 12 10:30 app.conf

忽略第一个字符(-代表普通文件,d代表目录,l代表软链接),后面的rw-r--r--就是权限部分。它一共有9个位置,前三、中三、后三分别代表属主权限、属组权限、其他用户权限:

  • r:读,门禁卡能打开房间门看到里面放了什么。
  • w:写,能进去改里面的东西,甚至清空、删除。
  • x:执行,如果这是个程序或者脚本,能跑起来;对目录来说,x表示有“进入”的权限。

注意一个特别反直觉的坑:对目录来说,只有r权限没有x权限,你是没法进入目录的。r权限只能让你列出目录里的文件名,列出来但进不去,等于门禁只让你看门外贴的名牌,不让你推门进去。所以一个目录如果要让别人能够cd进去访问内容,至少需要r+x。新建目录默认权限是755,就是因为需要组合权限保证可进入。

这里贴一张常用权限含义对照表:

权限值文件含义目录含义
r(4)可查看文件内容可列出目录中的文件名
w(2)可修改文件内容可在目录中新建、删除、重命名文件
x(1)可作为程序执行可进入目录并访问内部内容

4.2 chmod数字法:权限就是一组二进制开关

chmod最常用的方式是数字法,这套规则一定要会推,不是背。把rwx看成三个二进制开关,r=4,w=2,x=1,组合起来就是0到7的数字:

  • rwx = 4+2+1 = 7
  • rw- = 4+2+0 = 6
  • r-x = 4+0+1 = 5
  • r-- = 4+0+0 = 4
  • --- = 0+0+0 = 0

所以chmod 764 app.conf的含义就是:属主7(rwx完全权限)、属组6(rw读和写)、其他用户4(r只读)。这个推算过程你自己推一遍就永远忘不了。

日常工作高频组合给你整理一下:

chmod 644 file # 属主读写、组和其他人只读,最常用的普通文件权限 chmod 755 dir # 属主全权、组和其他人可读可进入,最常用的目录权限 chmod 600 file # 只有属主读写,密钥文件等敏感文件专用 chmod 700 dir # 私有目录,其他任何人都进不来 chmod 777 file # 全放开,慎用!仅限临时共享场合

随手提一句:有些新人图省事上来就chmod 777,这在大楼门禁里等于给全楼所有人配了你房间的全通卡。你的文件谁都看得见、改得动,一旦系统被入侵或者被同事误操作,你连追溯都难。生产环境看到777默认报警。

4.3 chmod符号法:精准调整

数字法适合一次把权限设全,符号法适合只调整某一个身份的权限。语法是:u(属主)、g(属组)、o(其他用户)、a(所有人),配合加减符号。

举几个例子:

chmod u+x deploy.sh # 给属主增加执行权限 chmod g-w,o-r app.conf # 去掉属组的写权限、其他用户的读权限 chmod a+x run.sh # 所有人增加执行权限

实操心得:我在写自动化脚本的时候,经常需要给脚本加执行权限,用符号法u+x比算数字快得多,一眼就知道自己在干什么。

4.4 umask:新建文件和目录的默认门禁规则

每次新建文件,系统都会分配一套默认权限。这套默认值的来源就是umask,一个从0到7的掩码值。先看输出:

umask

大多数Linux发行版返回0022。新建文件默认权限是666减去umask值:666-022=644,新建目录是777-022=755。

为什么文件不是755而是644呢?因为文件默认不允许带执行权限,这是安全考虑,防止你随手创建一个脚本就变成可执行文件。而目录必须带x权限才能进入,所以目录的默认基数是777。

如果你家在共享目录里工作,想让大家新建文件都能被同组人修改,可以把umask改成002:

umask 002

这样新建文件是644按基数是给属主权限、组写入。但注意这要在同一个shell会话中生效,要永久设置需要写入/etc/profile或者用户家目录的.bashrc里。

5. 文件归属管理:chown与chgrp的正确打开方式

权限位只是门禁的锁孔配置,还有一个维度是锁在谁的名下,这个由属主和属组决定。

5.1 chown:更换属主

很多新手只盯着chmod,完全忘了chown。但实际运维里这两个需要配合。

典型场景:我把一个部署脚本从root账号执行后生成,要转给devops小组使用:

chown xiaoming.deploy.sh

把属主改成xiaoming,属组改成devops的话,中间用冒号隔开:

chown xiaoming:devops deploy.sh

如果只想改成属组,用chown :devops deploy.sh,或者在完整命令里写成chown .devops deploy.sh也行,不同发行版略有差异,但冒号写法兼容性最好。

递归修改目录归属,用-R参数:

chown -R xiaoming:devops /mnt/devops-sharing/

这个-R要谨慎,在大型目录树上执行会花很长时间,而且如果把系统目录的属主改错了,后果可能相当严重。见过一个生产事故:有同事要在/var/www下部署一个项目,手滑写成chown -R xiaoming: /var,直接把整个/var目录的属主全改了,跑了一晚上权限批量修复才恢复。这个教训我一直记到现在。

5.2 chgrp:只改属组

如果只需要改属组,用chgrp更纯粹:

chgrp devops /mnt/devops-sharing

原理上和chown :devops一样,但语义更清晰,适合只动组不动属主的场景。

5.3 软链接文件的权限陷阱

还有一个新手容易踩的坑:对软链接使用chown或chmod的时候,加不加-h差别很大。默认情况下chown会跟随链接,修改的是链接指向的真实文件;加上-h才是修改软链接本身的属主。

chown -h xiaoming link_to_app

软链接自身的权限位实际没什么意义,真正生效的是它指向的目标文件权限,所以这个细节记住了就不会在排查权限问题时绕弯路。

6. 特殊权限位与sudo:门禁系统的应急通道和高级钥匙

前面讲的rwx是基础权限,Linux还有三个特殊权限位,经常在面试题里的角色就是在这里体现的。日常命令和查看权限时很容易看到s和t这两个字母,不了解的话会觉得莫名其妙。

6.1 setuid、setgid和sticky bit

第一个是setuid,缩写是suid。文件权限位上如果看到属主权限的x位置变成了s,说明这个文件设置了suid。它的作用是:当用户执行这个文件时,这个进程会临时获得文件属主的身份。

最经典的例子就是passwd命令:

ls -l /usr/bin/passwd

输出:

-rwsr-xr-x. 1 root root 33544 Jan 30 2024 /usr/bin/passwd

这里有个s,表示普通用户执行passwd时,内核会把进程的临时身份切换成root,这样才能去写只有root能写的/etc/shadow文件。秒懂通行证:suid就相当于一张临时管理员卡,平时你不是管理员,但刷这张卡进特定房间时,系统临时把你当管理员对待。

设置suid的方式是命令前三组权限位数字前面加4:

chmod 4755 app

或者符号法给自己的程序加suid:

chmod u+s app

第二个是setgid,缩写是sgid。对文件起作用时,执行进程会临时获得文件属组的身份;对目录起作用时,在该目录里新建的文件会默认继承目录的属组,而不是创建人的主组。这在共享目录场景下非常实用:

chmod 2770 /mnt/devops-sharing

2这个位置就是setgid。这样一来,devops组的人往目录里放文件,文件会归devops组所有,不会被创建人的个人组挂着,导致同组其他人没法改。

第三个是sticky bit,主要应用在/tmp这种公共目录。查看/tmp权限:

ls -ld /tmp

输出:

drwxrwxrwt. 20 root root 320 Jan 12 09:15 /tmp

权限位末尾的t就是sticky bit。它的作用是:在/tmp目录下,虽然每个人都有写权限,但只有文件属主(或root)才能删除自己的文件。这就像公共休息室的储物柜,虽然大家都能往里放东西,但你只能拿走自己的。如果没有这个限制,任何用户都能删除别人临时存放的文件了。设置方法:

chmod 1777 /tmp/tm

1就代表sticky bit。

这三个特殊权限位总结成一句口诀:suid看属主的x位,sgid看属组的x位,sticky bit看其他人的x位,看到s或t就知道是有特殊含义的。

6.2 sudo:给普通用户发一张临时管理员卡

sudo的设计初衷是把root权限按需分配给普通用户。新人最容易出的幺蛾子就是直接切到root账号随便操作,但生产环境规范做法是用sudo提权,审计日志里会留下记录。

先看当前用户是否能sudo,可以用sudo -l:

sudo -l

配置sudo权限的文件是/etc/sudoers,编辑这个文件必须用visudo命令,它会帮你检查语法错误,防止你把文件写坏导致所有人都没法提权了。给xiaoming授权让他能运行所有命令,在sudoers里加一行:

xiaoming ALL=(ALL) ALL

这行的四个字段含义是:用户名、来源终端、可以扮演的身份、可以执行的命令。更精细的授权是只允许跑特定命令:

xiaoming ALL=(ALL) /usr/bin/systemctl restart nginx, /usr/bin/less /var/log/nginx/*

这样就精确到了他能做什么事。运维新人做权限设计,我建议就朝着这个粒度去设计,比一堆人共用root密码要好得多。

6.3 ACL:超过三组权限时的门禁扩展包

最后提一下ACL(Access Control List),它适用于标准三组身份不够用的场景。比如一个文件需要让不属于属主也不属于属组的一个特定用户单独可访问,标准的ugo三组身份就办不到了。这时候用setfacl:

setfacl -m u:zhangsan:rw /tmp/project-notes.txt

给zhangsan这个特定用户单独授予读写权,同时保留原有权限。查看ACL用getfacl:

getfacl /tmp/project-notes.txt

ACL的优先级高于普通权限位,这也是排查权限问题时容易踩坑的点:明明ls -l显示没有权限,但用户能访问,很可能就是ACL里单独授权了。看到一个文件权限后面带一个加号,比如-rw-r--r--+,就说明它有ACL扩展权限。

7. 常见权限问题排查与实操心得

权限问题排查是Linux运维的日常之一,这里把自己实际遇到过的典型问题和解决思路整理一套速查表给你。

7.1 遇到Permission Denied先按这几步排查

最典型的问题是:我明明在该目录,为什么无法访问?

第一步:确认你登录的是什么身份,用id查一下自己的UID和所属组。第二步:用ls -ld逐级查看你访问路径上每个目录的权限,注意路径上的所有目录都需要x权限,缺一层就会卡住。第三步:用ls -l查看目标文件的属主和权限位,确认是哪个身份的权限不够。第四步:如果有setfacl,查一下ACL,看是否有额外授权在起作用。

我把这套排查流程整理成一张速查表:

症状常见原因快速排除方法
文件无法读取当前用户不在属主或属组中,且其他用户无r权限chmod 644修属主读写
目录无法进入路径中某个目录缺少x权限逐级ls -ld检查
可以读但无法修改文件对当前身份缺w权限chmod u+w file
脚本无法执行文件缺x权限chmod +x script.sh
可以cd但ls看不到文件目录缺r权限chmod +r dir
明明有权限还是不行ACL或SELinux在拦截getfacl查看,setenforce 0临时测试

7.2 实战心得:组共享目录的标准配置

我每次在服务器上配置一个团队共享目录,标准流程是这样的,你可以直接抄:

mkdir /srv/team-share chown root:devops /srv/team-share chmod 2770 /srv/team-share

第一步创建目录,第二步设置属组为devops,第三步设置2770权限,让组内成员完全访问且有setgid保证新建文件继承组归属。然后把团队成员用usermod -aG devops依次加进去。

这套配置比手动给每个人单独授权省心得多,也不会出现“张三建的文件李四不能改”的情况。我用了很多年,稳稳的。

7.3 不要再无脑chmod 777了

这里单独拿出来强调,因为这是新人和老手之间最明显的分水岭。777确实能让一切问题瞬间消失,但代价是彻底放弃安全隔离。一旦服务器上运行着Web服务,777的目录还可能会被写入恶意脚本,被入侵的风险直线上升。

按照经验,日常场景中99%的权限需求都能用644和755解决,最多加个组写权限670或者770来解决协作问题。只有临时传文件到公共目录时才考虑1777的临时目录。

7.4 修改系统目录属主要谨慎

我在前面提到过一次chown -R的事故,这里再重复强调一遍:chown -R和chmod -R本质上都是批量操作,执行前务必确认路径正确。你自己心里要有个数:递归操作在Linux里就是原子弹级别的命令,慢直观,错了代价高。

一个稳妥的习惯是先执行一次查看命令确认范围:

find /var/www -user root -ls | head

确认无误后再做批量修改。批量命令执行前也可以在后边加上echo模拟一下,比如准备执行chown前,先输出一下这次会改哪些文件:

chown -R --dry-run xiaoming:devops /var/www 2>&1 | head

新版chown工具支持--dry-run的可以看实际影响范围,不支持的老版本也能用find来兜底。

这套用户权限管理体系,本质上就一句话:先想清楚谁需要什么,再用门禁的视角把授权最小化配好。账号是门禁卡,组是门禁等级,rwx是门锁,chmod是配钥匙。把这条逻辑线顺下来,后面再学ACL、SELinux、AppArmor这些更进阶的安全机制,你就有底子了。

我个人操作上最后再分享两个小习惯:一是所有批量权限修改命令执行前都会先确认路径和属主范围,太重要了;二是每隔一段时间用find / -perm -4000来查一遍系统里所有带suid的文件,防止有异常的提权后门潜伏着。权限这东西,配好是本事,守住才是真本事。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询