
Linux入门之管理本地用户和组(上)很多人第一次接触Linux服务器看到“用户”两个字下意识会以为就是登录邮箱、网站上那种账号。但系统管理员口里的用户并不是那个意思。Linux里的用户是一套完整的身份体系每个文件有属主每个进程有属主每次访问资源都基于用户身份做校验。说得直白一点如果你不会管本地用户和组你连很多基础运维操作都没法往下做。这篇《Linux入门之管理本地用户和组(上)》我会把“本地用户和组”拆开揉碎讲清楚。你不需要有很高的基础只要会敲基本命令、能坚持看下去就能搞明白用户和组之间是什么关系、系统靠哪些文件记录身份信息、以及创建和删除用户时要养成的安全习惯。等下我会带你把查询、创建、修改、删除用户和组这些日常高频操作完整过一遍每一步都告诉你为什么这么干。这系列内容适合两类人一类是刚入门Linux、被各种权限报错劝退的新手另一类是平时只会在界面上点点点、偶尔要登录服务器处理问题的人。读完这一篇你至少能独立完成“给新同事创建账号并加入开发组”这类任务也知道踩到坑时去哪里查。咱们直接开始。1. 为什么要管理本地用户和组1.1 Linux是一个多用户系统Windows也好macOS也好其实都是多用户系统但Linux把“多用户”玩到了骨子里。服务器上往往同时跑着几十个服务每个服务可能用不同的账号运行甚至连前台登录的管理员也分成不同级别。之所以要这么设计不是为了麻烦而是为了“权限隔离”。想象一下如果一台机器上所有程序都用同一个超级管理员身份跑比如都用root那任何一个小漏洞被利用黑客就能拿到整个机器的完全控制权。而如果每个服务、每个员工各有各的账号即使某个账号被攻破攻击者能动的东西也非常有限。Linux最基础的安全模型就是一切资源都有属主和属组判断你有没有资格访问某个文件看的就是你是哪个用户、属于哪些组。这种模式也延伸到日常协作场景。比如某公司的一台服务器上所有人都在同一个目录里放脚本A写错了文件名B想删掉他的文件如果大家都是普通用户那不可能随便动别人的东西。系统就是靠用户和组的边界来维持秩序的。所以你要明白用户管理不是应付考试的操作题它是Linux安全体系的基石。1.2 用户与组之间到底是什么关系很多教程一上来就丢几个命令比如useradd、groupadd然后让你背参数。这样学的坏处是你根本不理解为什么创建用户时要指定主组为什么还要额外附加组。用一个生活化的类比每个用户相当于一个员工有自己的工牌编号这个编号就是UID。而组相当于部门部门也有编号叫GID。每个员工一定归属于一个主要部门也就是主组写入员工档案里同时一个员工还可以兼职挂名到其他部门这些额外的部门就是附加组。Linux继承了这个逻辑一个用户必须有一个主组这是你在/etc/passwd里的“身份证件”上标注的默认组同时用户还可以加入多个附加组写在/etc/group文件里。主组决定了你默认创建文件时的属组附加组则决定你额外能访问哪些组资源。这两者容易搞混很多新手一上来只知道把用户加到某几个组里却不理解主组的默认语义后面排查权限问题时就会一头雾水。1.3 什么是“本地用户和组”严格来说Linux系统里还有LDAP、NIS这类集中认证方式用户信息根本不存在本地机器上。这篇我们只聊最基础的“本地用户和组”指的是系统自己/etc/passwd和/etc/group文件里管理的账号。这个过程最直观也最不依赖外部网络环境适合所有入门者先打底子。比如你安装完一台Linux虚拟机用root登录后想创建四个不同角色的账号让他们各自能登录并操作各自目录这就是典型的本地用户管理。过程中你创建的账号不会同步到任何中央服务器机器坏了账号就丢了。理解这一点很重要它会帮助你建立“账号都是这台机器上的一份档案”的直觉。2. 用户和组的“身份档案”都藏在哪2.1 /etc/passwd用户列表但不是密码存放地很多人第一次看/etc/passwd文件时都会奇怪名字叫passwd里面怎么没有密码这是因为真正存放密码哈希的地方是另一个文件——/etc/shadow普通用户看不到。而/etc/passwd只是保存用户的基础信息每个用户占一行冒号分隔成7个字段。我们以一行真实记录为例zhang3:x:1001:1001:开发部张三:/home/zhang3:/bin/bash从左到右分别是字段位置含义示例值1登录名zhang32密码占位符x表示密码在shadow里x3UID 用户ID10014GID 主组ID10015用户描述信息大名叫什么、哪个部门开发部张三6家目录/home/zhang37登录Shell/bin/bash这里要记住两个关键点。第一第二个字段为x只是占位真正的密码哈希在shadow文件里如果直接看到一串密文反而说明系统配置很古老了。第二字段里的GID是“主组”的编号但主组叫什么名字需要去/etc/group里查才能对上号。2.2 /etc/shadow密码和认证策略的核心/etc/shadow权限默认为root专用普通用户连读都读不了。它每一行记录了用户密码的哈希值和老化策略同样用冒号分隔。常见字段长这样zhang3:$6$randomsalt$hashhashhashhashhashhashhash:18900:0:30:7:::理解字段顺序能帮你排查很多登录异常字段位置含义1登录名2密码哈希$6$开头表示SHA-512加密3最近修改密码的时间距1970年的天数4两次修改密码之间的最小天数5密码最长有效天数6密码过期前多少天开始警告7密码失效多少天后账户被禁用8账号失效日期距1970年天数9保留字段举个例子如果你看到第二个字段前面有一个感叹号!说明这个用户被锁定了哪怕密码正确也登录不了。这个细节在实际运维中特别常见创建用户但还没设置密码时shadow里通常是!!登录当然会失败。2.3 /etc/group和/etc/gshadow组的信息要分开看/etc/group是组信息的主文件每行格式也很规律dev:x:2001:zhang3,li4,wang5四个字段分别是组名、组密码占位符、GID、该组的附加成员列表。注意这里列出的成员都是“附加成员”主组成员不会出现在这行里因为主组关系已经写在用户的passwd记录里了。/etc/gshadow则存放组密码和组管理员信息日常用的比较少但你要知道有这个文件存在。大多数情况组密码不需要设置设了反而容易让权限管理变得混乱。2.4 为什么不能直接vi编辑这些文件既然这些是文本文件很多急性子新人都试过直接vi /etc/passwd然后删掉一行。这样做非常危险因为编辑器不会帮你锁文件如果同时有两条命令在写同一个文件或者其他进程正在读取很容易写出一半的内容导致系统识别用户时直接报错严重的时候所有用户都登不上。正确做法是使用vipw和vigr命令编辑。这两个命令本质上是把对应文件复制出来加锁后再打开编辑器保存时会校验格式有问题会直接提醒你。养成这个习惯能帮你避免很多半夜翻车的现场。3. 查询命令是日常最高频的操作3.1 先认清自己id、whoami、who、w管理用户前先要养成“看清楚自己当前身份”的习惯。很多时候你明明创建了用户切换过去却报权限不足原因就是你以为自己是谁但实际上系统认为你不是。下面几条命令基本每天都会用到id zhang3 # uid1001(zhang3) gid1001(dev) groups1001(dev),1002(ops) whoami # root w # 能看到当前每个用户登录的终端、来源IP和正在执行的命令id命令是最值得你多看两眼的一条。它直接把用户的UID、主GID以及所有附加组都列出来了。如果你发现一个用户同时在五个附加组里那他在系统里能碰的资源就相当多排查权限问题时要特别留意。3.2 查询某个用户的信息和登录痕迹要单独查看某个用户的档案可以用getent命令也可以直接读文件。推荐优先用getent因为它会按系统配置的数据库查找理解更标准getent passwd zhang3 # zhang3:x:1001:1001:开发部张三:/home/zhang3:/bin/bash passwd -S zhang3 # 查看密码状态是否已锁定、是否已过期 last zhang3 # 查看该用户最近登录历史谁在什么时间从哪里登录过 lastlog # 查看所有用户最近一次登录的记录如果显示Never logged in那就是没登录过这些查询命令组合起来基本能帮你还原这个用户的完整使用痕迹。比如排查安全隐患时先看lastlog再看passwd -S基本就知道这个账号是否一直在被使用、密码是否长期未变。3.3 查询组和组成员关系组的查询相对简单。想看系统里有哪些组直接用getent group。想看某个用户到底在哪些组里用id 用户名最直接或者用groups 用户名它会显示当前用户所属的所有组列表。做权限排查时我习惯把id和getent group结合起来看先从id看用户的组列表再从组那边反查这个组里还有哪些成员双向验证。一个容易忽略的细节是groups命令显示的顺序有讲究第一个是主组后面才是附加组。如果你写脚本判断用户是否属于某个组最好用id -nG这类命令取干净结果别依赖肉眼排列顺序。3.4 常用的查询组合实战只要理解了查询命令日常排障效率会提升一大截。比如你发现目录/project/shared里某个新用户读不了文件可以先这样三步走id zhang3 getent group dev ls -ld /project/shared第一步确认用户身份和组归属第二步确认dev组的成员和GID第三步确认目录自身的属主和权限。三步一排查问题基本就浮出水面了。4. 创建用户与调整用户属性4.1 先用最朴素的useradd感受默认行为进入正题前先做一个小实验。在一台干净的CentOS或Ubuntu机器上执行useradd test01然后观察结果。你会发现以下现象系统自动生成了一个家目录/home/test01自动分配了一个UID比如1002同时自动创建了一个同名的主组test01。这是现代发行版默认的useradd行为每个用户建好后默认主组是自己的同名组。但如果你用的是比较老的系统或者手工改过用户默认配置行为可能完全不一样老版本useradd可能不会创建家目录也不会创建同名主组而是把用户丢进默认的users组里。所以我的第二个建议是创建用户时一定要明确参数不要依赖系统的默认演算法否则换一台机器行为就变了脚本很容易踩坑。4.2 常用参数拆解每个选择都有理由我整理了一张高频参数表每个参数背后都对应一个具体场景参数作用典型使用场景-u UID手动指定用户ID为避免UID冲突或为了与外网同步ID-g 主组名指定主组你希望用户默认属于某个现有组-G 组1,组2指定附加组让用户额外访问多个项目组的资源-d 目录指定家目录不想把家目录放在/home下-m创建家目录确保家目录存在-s Shell指定登录Shell设置为/sbin/nologin可禁止登录-e 日期指定账号失效日期临时工账号设置到期日-c 描述添加用户描述记录姓名、部门方便后期管理拿一条实际命令举例useradd -u 1005 -g dev -G ops,dba -d /home/share/zhang5 -m -s /bin/bash -e 2025-12-31 -c 临时开发-张五 zhang5这条命令做了这些事固定UID 1005主组用dev组附加组加ops和dba家目录放在/home/share/zhang5并创建好允许bash登录账号在2025年12月31日失效描述信息写明临时开发。这一把操作下来这个用户和公司里的权限规划就完全对应上了不会出现“这人到底在哪个组”的糊涂账。使用官方文档查参数细节时要注意不同发行版的useradd版本存在差异比如Ubuntu很多参数是GNU风格CentOS也类似但个别参数名称可能微调。最保险的办法是执行man useradd看本机文档。4.3 设置密码passwd命令的完整套路创建好用户后如果不设置密码这个用户是无法登录的。原因前面提过shadow文件里密码字段是!!。设置密码最基本的操作是passwd zhang5交互式输入两次相同密码即可。如果你在写自动化脚本不希望卡在交互提示上可以用echo 临时密码123 | passwd --stdin zhang5这个--stdin参数在RHEL系很好用但Debian系未必支持需要留意。另外再多说一句把密码写在命令行里在bash历史里会留下痕迹。真正搞生产脚本时应该通过管道的变量传递并且用完立刻清理历史记录或者干脆用chpasswdecho zhang5:临时密码123 | chpasswdchpasswd是批量修改密码的利器管理员从文件导入账号时特别好用。4.4 修改用户属性usermod不是二次创造创建完用户之后经常需要调整属性这时候用usermod。注意usermod的很多参数和useradd长得一模一样但语义是“修改已有用户”。下面是几个我用得最多的场景第一个把用户加入一个新附加组usermod -aG docker zhang5-aG里的-a是append追加的意思必须和-G一起用否则会把用户从原有附加组里全部踢出来。这个问题我见过不少人踩过不加-a执行完发现用户本来在的几个组全没了。第二个锁定和解锁用户usermod -L zhang5 # 锁定相当于shadow密码字段前面加! usermod -U zhang5 # 解锁第三个修改用户的家目录或Shellusermod -d /data/zhang5 -m zhang5 # 修改家目录并移动原家目录内容 usermod -s /sbin/nologin zhang5 # 禁止这个用户直接登录系统这里要特别注意一个坑如果用户当前有进程正在运行你修改它的家目录或Shell不会立刻杀掉进程但下一次登录会生效。修改Shell时尤其要谨慎一定先确认新Shell路径存在否则用户下次登录会直接被拒绝。我在生产环境里见过有人把root的Shell改成不存在的路径结果下次root无法直接登录还好还有物理控制台能救场不然真的非常被动。4.5 删除用户userdel的时机与风险删除用户的命令是userdel。最安全也是最常用的做法userdel -r zhang5-r参数会同时删除用户的家目录和邮件箱但不会删除该用户在其他地方创建的文件。这是很多人容易忽略的一点。举例来说如果这个用户往/data/project目录里写过文件你删掉账号后那些文件就变成了“孤儿文件”显示为一串数字UID后续想清理归属关系会很头疼。所以删除用户前我建议先用find把可能属于这个用户的文件扫一遍find /data -user zhang5 -ls确认没有重要未备份文件后再执行删除。另外系统不会允许你删除当前正在登录的用户userdel会直接报错。正确的处理方式是先踢下线或等待用户退出再继续删除操作。4.6 UID复用一个容易中招的细节UID相当于用户的数字工号。如果你删掉了用户zhang5UID 1005就空了。之后你再创建一个新用户系统默认分配的UID很可能会继续用1005。听起来没什么但问题来了旧zhang5曾经在/data/other目录里留下过文件这些文件的属主编号还是1005新用户自动继承了这些文件的属主身份莫名其妙就能访问旧同事留下的数据了。所以在安全性要求高的机器上我建议手动指定一个不会短时间复用的UID比如顺着当前最大UID往上加而不是直接复用空出来的编号。这一点在生产环境里特别重要尤其是服务账号经常被删除和重建的场景。5. 组的创建与维护5.1 组是权限的“文件夹”组的意义在于把多个用户的权限打包。往细了说你不需要挨个给用户授权某个目录只需要把目录的属组设成某个组再让用户加入这个组就能轻松管理一组人的共同访问权限。这也是Linux设计里最顺手的多人协作方式。所以创建组之前建议规划一下组名规范。别随手建个group1、group2过三个月你自己都想不起来这是干什么的。组名最好跟项目或者部门强相关比如dev、ops、finance、project-alpha维护成本会低很多。5.2 groupadd命令的使用与注意点创建组的基本命令groupadd ops groupadd -g 3000 project_beta-g参数可以指定GID如果希望组ID保持稳定比如同步到其他机器这个参数非常有用。-r参数可以创建系统组GID会在系统区间内主要给服务账号用例如让某个服务进程以系统组身份运行。有一点很多人会忽略纯粹通过groupadd创建的组初始没有成员。后面必须通过gpasswd或usermod把用户添加进去组才有意义。“创建组但忘了加人”在新手堆里简直不要太常见。5.3 groupmod与groupdel改组名要谨慎修改组信息用groupmod最常用的操作是改名groupmod -n new_ops ops改名的坑在于如果要改的是某个用户的主组名那用户home目录上的默认属组编号不会变只是名字变了。看起来问题不大但如果你的脚本或服务内部是靠组名来匹配权限的改名之后所有引用旧组名的地方都要同步改否则会找不到组。删除组用groupdel但有一个限制如果某个用户的主组正是这个组删除会失败。系统总是保护“还有人依赖这条主组关系”。处理办法是先修改这些用户的主组比如usermod -g users tempuser1 groupdel old_project5.4 gpasswd管理组成员的最顺手工具组内成员的增删我最常用的是gpasswd因为语义很清楚gpasswd -a zhang5 ops # 将zhang5加入ops组 gpasswd -d zhang5 ops # 将zhang5移出ops组它还能设置组密码和管理员但对一般场景来说记住-a和-d就够用了。这里强调一下追加成员和删除成员的操作如果使用usermod则容易误伤原有附加组gpasswd则是精准操作单个组不容易出诡异问题。所以我的习惯是涉及单个组的成员管理用gpasswd涉及一次添加多个组用usermod -aG。5.5 newgrp临时切换有效组很多教程不会提newgrp但它其实很有用。比如你当前有效组是dev但你想临时以ops组的身份创建文件直接执行newgrp ops之后你新建的文件属组就变成ops了。这样做的好处是你不必退出系统重新登录也不用修改任何配置。但要提醒的是newgrp会启动一个新的Shell你原来的工作目录和环境变量部分会保留执行完想回原组直接输入exit退出这个子Shell即可。6. 综合实操案例为新同事搭建完整账号与组体系6.1 需求场景还原假设你负责的一台测试服务器迎来一位新同事zhang5他属于团队AppDev同时还需要临时读取OperationTeam的文档。你希望他有一个独立家目录、能够正常登录bash、不能随意修改系统配置文件并给账号设置一个明确的失效日期。这个场景非常典型加起来就是一串命令的事。但只敲命令还不行你得先想清楚主组用哪个附加组加哪个HOME目录放哪密码怎么设置。下面走一遍完整流程。6.2 实操步骤完整演示第一步检查现有组是否存在getent group | grep -E appdev|opsteam如果没有appdev组先创建groupadd appdev groupadd opsteam第二步创建用户useradd -g appdev -G opsteam -d /home/zhang5 -m -s /bin/bash -c 新同事-张五 -e 2026-06-30 zhang5这条命令指定的主组是appdev附加组是opsteam家目录是/home/zhang5并同时创建好登录Shell为/bin/bash描述信息写清楚账号有效期到2026年6月30日。执行完成后建议马上验证id zhang5 # uid1010(zhang5) gid1000(appdev) groups1000(appdev),1001(opsteam)第三步设置密码passwd zhang5按提示输入初始密码并告知新同事首次登录后自行修改。第四步再检查账号状态passwd -S zhang5看到类似zhang5 PS ...的标记说明密码已设置账号处于可用状态。如果显示NP或LK则分别表示没有密码或已锁定。6.3 实操心得验证远比创建重要很多新手创建完用户就以为大功告成了结果过几天同事说登录不了。我自己的习惯是创建完之后立刻做一次完整验证包括用普通用户身份执行su - zhang5看能否正常切换确认家目录权限是750而不是777确认用户能读取组内协作目录并创建自己的文件。一套验证下来账号是否能直接投入使用心里就有底了。另外要特别注意如果设置了-e失效日期还要养成用chage -l zhang5查看账号有效期的习惯避免过期后没人察觉直到同事慌慌张张找到你说上不去了才反应过来。7. 常见问题与排查技巧实录7.1 用户创建后无法登录原因大致有几种密码没设置、密码字段被锁定、登录Shell设置错误、账号已过期。排查顺序我一般这样走passwd -S zhang5 # 看密码状态 getent passwd zhang5 # 看shell和家目录路径 usermod -s /bin/bash zhang5 # 修正shell如果shadow里是!!用passwd重新设一次密码就好。如果Shell路径不存在usermod改掉即可。这条排查路径几乎能解决九成登录问题。7.2 提示“user does not exist”但文件里明明有记录这种情况往往是命令大小写不匹配或者用户数据库缓存出了问题。比如你输入了getent passwd Zhang5Linux用户名是区分大小写的你查不到人的时候要先用grep确认字符串大小写。还有少部分情况是LDAP配置把本地文件屏蔽了但这超出本地范围遇到时先检查getent passwd和grep /etc/passwd结果是否一致即可。7.3 用vipw误改导致passwd文件损坏此处指的损坏不是文件被删除而是字段数量不对、行格式错误。一旦发生系统可能在下次启动时拒绝正常多用户登录。遇到这种情况第一反应该是不要慌直接从备份恢复。绝大多数系统在编辑前都会自动生成备份文件例如/etc/passwd-或/etc/shadow-直接用备份文件覆盖回正确版本cp /etc/passwd- /etc/passwd cp /etc/shadow- /etc/shadow然后再次用vipw检查格式。所以平时也建议定期备份这两个关键文件关键时刻能救命。7.4 组删除失败主要用户仍然使用该组删除组时如果出现类似cannot remove the primary group of user的提示就说明有用户的主组还是它。处理办法很简单先看哪些用户主组使用了这个GIDawk -F: $42001{print $1} /etc/passwd然后把相关用户的主组改掉再执行groupdel基本就能成功。7.5 关于直接编辑文件vs专用命令的最终建议把用户和组文件当普通文本文件直接编辑是新手最容易养成的错误习惯。除了前面提过的并发写坏风险外你还要面对字段校验、权限一致性和备份恢复的问题。我的最终建议是凡是涉及用户日常增删改一律使用useradd/usermod/userdel、groupadd/groupmod/groupdel、passwd/chage这些标准化命令只有遇到批量微调或紧急修复时才使用vipw和vigr并且必须先备份。这套组合拳用熟了以后再碰上“用户不能登录”“新账号进不了组”“删不掉组”这类问题你按上面的排查顺序走一遍十有八九能在五分钟内找到根源。最后再分享一个小技巧每次做完账号变更顺手把需求背景和操作命令追加到工作日志里。别小看这一行记录几个月后系统出问题能帮你迅速回想起来当时到底做了什么这本账比任何工具都值钱。