
刚折腾完一台Ubuntu Server又帮朋友处理了一个“用户误删数据”的烂摊子我越来越觉得Linux用户管理这玩意儿就像房子的门锁和钥匙分配系统。你一个人住的时候觉得无所谓一旦合租、有访客、或者请了保洁怎么发钥匙、怎么设门禁、怎么在出问题时追溯是谁干的就全得靠这套规则。今天这篇东西我打算把Ubuntu包括22.04和24.04 LTS下用户管理这件事聊透从基础的增删改查到sudo权限分配、用户组策略再到密码过期、锁定账户、批量创建用户这些实战场景全程用命令说话顺便把我踩过的坑和补救方案一起放出来。需要说明的是这篇内容主要适合三类人刚把Ubuntu装好、准备拿它当主力开发机或家庭服务器的爱好者公司里需要给同事开账号、做权限隔离的运维新手还有那些想系统补一下Linux用户体系知识、但不想啃大部头文档的朋友。读完你可以直接照着操作遇到问题也能按图索骥排查。1. 先搞懂Ubuntu的用户体系不只是“用户名密码”很多从Windows转过来的朋友一开始对Linux用户管理最大的困惑是为什么搞个用户这么麻烦还有UID、GID、家目录、Shell一堆概念其实没那么玄乎。Ubuntu里的每个用户本质上就是/etc/passwd文件里的一行记录每个组就是/etc/group里的一行记录。密码则单独存在/etc/shadow里普通用户看不到。1.1 用户、UID和家目录的关系拆解你随便在终端敲一句cat /etc/passwd能看到类似下面这样的内容root:x:0:0:root:/root:/bin/bash chen:x:1000:1000:chen,,,:/home/chen:/bin/bash testuser:x:1001:1001::/home/testuser:/bin/sh一行有7个字段用冒号分隔含义依次是用户名、密码占位符真正的密码在shadow里、UID、GID、注释信息、家目录、登录Shell。这里面最关键的是UID。系统判断“你是谁”不看用户名而是看UID。root的UID是0普通用户一般从1000开始Ubuntu的约定1到999是系统用户留给各种服务用的比如sshd、mysql这些。为什么要强调UID因为你在做用户迁移、或者用usermod改用户属性时很可能遇到UID冲突问题。我举个例子你从旧服务器同步数据过来新机器上已经有个用户UID是1001了结果你把旧机器上UID也是1001的另一个用户的家目录直接拷过来轻则权限混乱重则两个用户能互相读对方的私密文件。所以我的习惯是创建重要用户时直接指定UID避免这种隐性问题。家目录这块也值得展开一下。默认情况下Ubuntu的useradd命令不会自动帮你创建家目录而这个行为恰恰是新手最容易踩的第一个坑。后面我讲命令时会重点说。1.2 用户组的作用为什么不能只盯着单个用户用户组解决的是“批量授权”问题。比如你公司服务器上有个/data/project目录希望市场部的几个同事都能读写你当然可以一个个用户去设置ACL但更干净的做法是建一个market组把相关用户都加进去然后给目录设置组权限。Ubuntu里有个有意思的特长创建新用户时会默认创建一个与用户名同名的私有组Initial Group。这个设计叫“私有组机制”好处是每个用户默认在自己的组里方便用组权限控制家目录访问。比如你创建zhang这个用户系统会同时创建zhang组并且/home/zhang的属组就是这个组权限是755也就是说组内成员有读和执行权限但没有写权限。这个细节很多人没注意结果后面配置Samba共享或者git仓库时发现同组用户能读不能写卡了半天。所以说理解用户组不是为了背概念而是为了在实际分配权限时能做出干净、好维护的方案。你花5分钟规划好组结构能省下后面大量“为什么他访问不了”的排查时间。2. 核心实操用命令玩转用户增删改查这一节是全文的重头戏。我不打算把man手册抄一遍而是结合高频场景把最常用的命令和参数讲透并解释每个关键选项背后的“为什么”。2.1 创建用户useradd和adduser我该用哪个Ubuntu下创建用户有两条路adduser和useradd。这俩名字很像但爹不一样。useradd是系统原生的低层工具参数多、灵活但不会自动帮你做很多“贴心”的事adduser是Ubuntu封装的高层工具本质是调用了useradd但会交互式地帮你设密码、填用户信息、自动创建家目录对新手极其友好。我的建议日常交互操作用adduser写脚本批量创建用useradd。原因很实在adduser的交互式流程能帮你减少遗漏尤其是家目录、密码、Shell这些基本属性的设置但它在自动化场景下一路next式的提问反而碍事。先看adduser的典型用法sudo adduser zhangshan执行后系统会问你新用户密码、全名、电话等一堆信息一路回车其实也行就是密码必须输而且输的时候不显示任何字符新手容易以为自己键盘坏了。全程自动创建家目录/home/zhangshan、用户组、Shell默认是/bin/bash还会把/etc/skel目录下的骨架文件复制进家目录。这也是为什么adduser创建的用户一登录就有.bashrc、.profile这些配置文件而用useradd创建的用户可能干干净净什么都没有。再看useradd批量和精细化创建sudo useradd -m -d /home/zhangshan -s /bin/bash -c Zhang Shan -u 1050 -G sudo,dev zhangshan各参数含义-m创建家目录-d指定家目录路径-s指定登录Shell-c注释信息一般写全名-u手动指定UID-G附加组可以多个逗号分隔。尤其提醒如果不加-m默认没有家目录很多教程里没提结果用户建好了登录进去发现在/根目录下面瞬间懵圈。2.2 修改用户和密码策略usermod与chage实战用户创建好之后改属性是家常便饭。usermod是主力工具用法跟useradd很相似因为底层的用户数据库操作逻辑是一样的。常见场景把用户加进sudo组sudo usermod -aG sudo zhangshan这里-aG里的-a是append的意思这个参数极其重要。如果不加-a直接用-G sudo zhangshan系统会用sudo组替换掉用户当前所有的附加组比如他原本在www-data组、docker组里一下全没了。这种“覆盖式修改”的坑我踩过不止一次排查问题时发现用户突然无法访问某些目录了一查组关系全变了吓得一身冷汗。所以凡是往已有用户上加组永远用-aG写进你的肌肉记忆里。锁定和解锁账户比如员工离职、或者怀疑账号被盗sudo usermod -L zhangshan # 锁定 sudo usermod -U zhangshan # 解锁锁定的原理是在/etc/shadow对应行的密码哈希前加个!前缀让任何密码都无法匹配。这种方式比直接删用户稳妥因为保留了用户的数据和配置。密码策略管理用chage很多人忽略这个工具但它确实好用。比如强制用户每90天改一次密码提前7天提醒密码最长使用120天sudo chage -M 90 -W 7 -I 120 zhangshan查一下用户密码状态sudo chage -l zhangshan输出会告诉你密码上次修改时间、过期时间、宽限期等。强制新用户首次登录必须改密码的办法也是用chagesudo chage -d 0 zhangshan把“密码最后修改日期”设为0逼着用户下次登录时必须先改密码这对初始账号发放场景尤其有用。上述命令执行后建议顺手验证一下/etc/shadow里的变化能帮你更直观地理解所以然。2.3 删除用户一个容易出问题的危险操作删除用户是用户管理里“最危险”的操作。直接userdel username只会删除用户记录但家目录、邮件池、文件都留着加上-r参数会连家目录一起删掉sudo userdel -r zhangshan问题来了如果这个用户不是普通用户比如程序创建的或者他在系统其他地方比如/var/www、/data下还有文件光靠-r是扫不干净的。删完后系统里会留下一堆“孤儿文件”显示UID数字而不是用户名你甚至不知道这是谁留下的。而且如果当时这个UID后面又被新用户占用了那你简直是在给新用户“送装备”——他莫名其妙就拥有了前主人的数据访问权限。所以我的建议是删用户之前先全面搜索他的文件sudo find / -user zhangshan -not -path /proc/* -not -path /sys/* 2/dev/null然后人工确认哪些该留、哪些该清。还有一个思路更稳不立刻删先用usermod -L锁定账户过一两个月确认无人反馈异常了再删除。这个“冷静期”操作对服务器环境尤其推荐。3. 权限管理进阶sudo、组权限与特殊场景用户管理不只是“开门发钥匙”更重要的是“门禁划分”。Ubuntu的权限模型分三层普通权限rwx、特殊权限SUID/SGID/Sticky Bit、以及sudo授权。我们一层层看。3.1 sudo的配置逻辑与风险控制如果说普通用户是“合租室友”root是“房东”那sudo就是房东临时给的“万能钥匙”还是可以随时收回的那种。Ubuntu桌面版安装时创建的第一个用户默认在sudo组里服务器版则安装时让你指定一个用户同样默认加进sudo组。看一下当前用户有什么sudo权限sudo -l编辑sudo权限非常危险的操作要小心sudo visudovisudo之所以用这个名字是因为它在保存时会校验语法防止你写错导致sudo直接崩溃。千万别用普通的vim或nano直接编辑/etc/sudoers一旦语法错误所有用户包括你自己都无法再sudo了那就是事故现场。sudo权限不仅仅是“给不给root”的问题可以做得非常精细。比如允许某个用户只重启服务而不给全部root权限zhangshan ALL(root) /usr/bin/systemctl restart nginx这行的意思是zhangshan可以在任何主机ALL上以root身份执行/usr/bin/systemctl restart nginx这一条命令。这种按需授权的做法适合给那种“只需要管一个服务”的同事最大程度降低风险。sudo组和root组是两个概念。有些人喜欢把用户加到root组里这在Ubuntu上几乎没什么意义因为root组的权限并不等价于root用户真正的管理员权限只认sudo组或sudoers配置。我以前就看到有教程教人“把用户加进root组获得root权限”纯粹误导多亏了下半句的正解不然读者照做发现没用又要绕远路。3.2 用户组管理从创建到应用全链路组管理的命令相对简单groupadd、groupmod、groupdel。需要注意的坑主要有两个。其一删除组时如果组是某个用户的主组Initial Group会删除失败。这时你需要先把用户的主组改到别的组比如usermod -g othergroup zhang然后再groupdel oldgroup。其二组成员信息修改后已登录的会话不会自动刷新组权限。比如你把用户加到docker组但这个用户已经开着终端了他直接敲docker ps还是会报权限不足。必须重新登录退出再ssh进来或者newgrp docker切换一下组权限才生效。这个坑在Docker、以及访问USB设备等场景下非常常见几乎每周都有人问“为什么加了组没用”。查看一个用户属于哪些组用id zhangshan或者groups zhangshan。id信息更详细带UID、GID和SELinux上下文如果启用的话排查问题时第一件事就是敲id能快速确认身份和组关系是否正常。3.3 特殊目录权限与ACL当基础权限不够用时普通rwx权限解决不了所有问题。比如有个目录希望同组的用户可以写但不能删别人的文件。这时候就要用到粘滞位Sticky Bit。/tmp目录就是典型例子——任何人都能创建文件但只能删除自己的文件。设置粘滞位sudo chmod t /data/shared再比如希望某个用户或组对某个目录有指定权限但你不想改变目录属主、也不想让所有同组人都获得权限那就该上ACL了。Ubuntu默认的ext4文件系统支持ACL通常无需额外安装不过工具包要装一下sudo apt install acl给用户zhang设置对/data/project目录的读写执行权限sudo setfacl -m u:zhang:rwx /data/project查看ACLgetfacl /data/project删除特定ACL条目sudo setfacl -x u:zhang /data/projectACL的隐藏好处是ls -l只能看到第一层权限真正的权限以号标记细节需要getfacl查看。你要是看到某个目录权限后面多了个别慌那是ACL在起作用赶紧用getfacl看清谁有额外权限。这个细节可以帮你透视图中的访问控制到底是怎么生效的。4. 常见用户管理故障与排查实录用户管理这块出问题的频率比想象中高尤其多用户服务器上。下面这几个场景我基本都实战处理过直接把思路和命令给你遇到类似问题照着来。4.1 忘记登录密码怎么办这是全网最热门的Ubuntu问题之一。如果你是在本机操作的机器前可以通过GRUB进入恢复模式来重置密码。重启机器开机时按住Shift键唤出GRUB菜单选择Advanced options进去找到recovery mode那一项然后选root shell有的版本是root Drop to root shell执行mount -o remount,rw / passwd 你的用户名如果是远程服务器且你自己还有sudo权限那就简单了sudo passwd 你的用户名但如果你是唯一的管理员且sudo密码也忘了那就比较痛苦了。如果机器上有另一个有sudo权限的用户可以让那个人帮你重置否则只能走物理访问恢复模式或者用Live USB方式进入系统挂载磁盘后直接修改/etc/shadow里的密码哈希。具体操作思路在Live系统里chroot到原系统然后passwd重置或者直接删掉/etc/shadow中该用户密码哈希字段让他下次免密登录进去后再设置新密码。注意最后这种方法极不安全仅限本地物理机应急服务器千万别这么干。4.2 SSH无法连接或登录后被拒SSH登录用户失败一般分三种情况。第一种用户不存在或者密码错误服务端日志会明确提示。查看日志sudo tail -f /var/log/auth.log这是排查SSH问题的第一利器几乎所有登录失败的原因都能在这里看到。第二种用户存在但密码对却被公钥认证流程挡在外面。常见原因是家目录或~/.ssh/authorized_keys权限不对。Ubuntu对权限很敏感家目录权限不能是777.ssh目录必须是700authorized_keys必须是600否则服务器会出于安全考虑拒绝加载密钥。修复权限sudo chown -R 用户名:用户名 /home/用户名 sudo chmod 700 /home/用户名/.ssh sudo chmod 600 /home/用户名/.ssh/authorized_keys第三种更隐蔽一点用户Shell配置有问题。如果用户被分配了不存在的Shell在/etc/passwd里写的是/bin/fish但系统没装登录时会直接失败或闪退。检查一下cat /etc/passwd | grep 用户名改Shell用sudo usermod -s /bin/bash 用户名4.3 误删用户与文件权限恢复删用户一时爽恢复火葬场。如果不小心删了用户但保留了他的家目录备份恢复的思路是先查原来的UID和GID如果备份里有记录然后用相同UID重新创建用户再把家目录的所有权改回去sudo useradd -m -u 原UID -G sudo 用户名 sudo chown -R 用户名:用户名 /home/用户名查UID的办法如果备份的tar包里没有保留/etc/passwd可以用sudo find /数据备份目录 -maxdepth 2 -printf %u:%g\n | sort -u看哪些文件归属那个已经消失的用户名大概率能反推UID。不过说实话这是兜底方案最好养成备份/etc/passwd、/etc/group、/etc/shadow三个文件的习惯用户管理出问题的时候这三个文件就是“救命稻草”。我自己的服务器上写了个cron每周日把这三个文件压缩备份到安全目录这个习惯帮我省了不止一次大麻烦。4.4 用户无法sudo的快速排查“明明加进sudo组了怎么还是无法sudo”这是群里被问烂了的问题。一查原因几乎都是忘了重新登录。组权限的生效需要新的会话退出终端重进一次就解决了。另外一个容易忽略的点sudo组在sudoers文件里的引用写法。正常情况下Ubuntu的/etc/sudoers默认有这么一行%sudo ALL(ALL:ALL) ALL千万别手贱把这行删了。以前帮人排查发现他为了“安全加固”把sudo组从sudoers里清出去了结果重启后所有普通用户全部失去sudo能力包括他自己。如果真发生了这种情况你只能再次进恢复模式或者重新用root登录把这一行加回去。这个教训的价值在于安全加固之前先想清楚后果。如果希望某个用户只能sudo特定命令按我前面讲的在/etc/sudoers.d/目录下新建一个文件比直接改sudoers更规范避免中心文件被改乱echo zhangshan ALL(root) /usr/bin/systemctl | sudo tee /etc/sudoers.d/zhang-nginx然后执行sudo visudo -c校验语法没问题就生效。用/etc/sudoers.d/这个目录管理分权是正规运维的做法清晰可维护也谈不上什么高深。5. 批量创建用户与账号生命周期管理服务器上经常有一次性要创建几十个账号的场景比如学校机房、公司新入职一批实习生。一个个adduser显然太低效这时就需要脚本出场。5.1 用脚本批量创建用户的参考方案先准备一个用户名列表文件users.txt每行一个用户名然后写脚本#!/bin/bash # 批量创建用户并设置初始密码强制首次登录修改 while read user; do if id $user /dev/null; then echo 用户 $user 已存在跳过 continue fi sudo useradd -m -s /bin/bash $user echo $user:初始密码123 | sudo chpasswd sudo chage -d 0 $user echo 已创建用户: $user done users.txt这里用到chpasswd搭配chage -d 0作用是批量设置初始密码并强制首次登录修改比逐条交互式设密码高效得多也比直接把密码hash写进shadow更稳。要注意脚本里用了初始密码123这种弱口令因为是初始密码、马上会被改掉算是可接受的做法但如果你面对的是高安全环境建议直接用随机密码并打印出来交给用户。5.2 账号生命周期管理从创建到回收创建账号只是开始后续的审计和回收才是重点。有些用户长期不登录该禁用就得禁用有些账号要到期自动失效。这个场景用chage可以做到给一个临时账号设置到期日期比如2025年12月31日失效sudo chage -E 2025-12-31 temp_employee查看所有用户密码和到期状态浏览一波sudo passwd -S 用户名 # 查看单个用户状态 sudo chage -l 用户名 # 更详细包括到期时间、密码改动时间批量查看哪些用户密码即将过期可以写个简单循环这里就不再赘述核心就是围绕/etc/shadow的第三字段密码最后修改日和第五字段密码最大有效期做计算。说个更实操的思路你可以用awk去解析/etc/shadow把那些“密码已过期但账号还没锁定”的用户捞出来主动联系他们改密码。这比等他们自己发现登录不了再找你体验好得多。5.3 用户审计与系统安全建议用户管理做得好不好体现在是否能回答“当前系统里有哪些用户、各自有什么权限”。定期审计是很有必要的至少每季度来一次。几个常用审计命令查看所有普通用户UID大于等于1000awk -F: $31000 $365534 {print $1, $3, $6} /etc/passwd列出有sudo权限的所有用户getent group sudo | cut -d: -f4列出当前所有登录用户who查看登录历史last查看最近所有sudo提权记录会留下不少内容建议认真看看sudo grep sudo /var/log/auth.log | tail -50安全建议部分我把个人的几条原则总结一下不要日常用root操作。Ubuntu默认禁用了root登录不是没有道理把日常操作放普通用户里需要管理员权限时再sudo出错概率和风险都低得多。用户分工要明确。一个用户只负责一个岗位的职责。比如跑web的、跑数据库的、做备份的尽量分开避免一个账号权限过大。定期轮换密码与密钥。重要服务器可以配合fail2ban之类工具防爆破但那是另一个话题了用户层面至少把密码策略设好。禁用空密码用户。检查一下sudo awk -F: ($2){print $1 空密码} /etc/shadow如果输出结果第一时间passwd那个用户补上密码或者usermod -L锁掉。空密码账号在裸奔这可不是小事。6. 关于工具链的几个补充实用软件与替代方案除了系统自带的命令Ubuntu用户管理还有一些“高阶兵器”在特定场景下能大幅省力。6.1 为什么建议装一个web管理面板如果你管理的机器不止一两台或者你不太习惯全命令行操作可以考虑安装Webmin或Cockpit。Cockpit是红帽系主导但在Ubuntu上也能装模块化设计轻量干净通过浏览器就能管理用户、查看系统状态、配置网络和存储。安装很简单sudo apt install cockpit sudo systemctl enable --now cockpit.socket然后浏览器访问https://你的服务器IP:9090用系统用户登录即可。不过说实话Web面板的管理范围还是受限真要精细控制权限、改sudoers、搞ACL终端永远是绕不开的。面板适合快速操作、可视化管理命令行适合深度配置两者不冲突互补着用。6.2 用LDAP或FreeIPA做集中用户认证这个算是“进阶话题”了。当你有三台以上服务器、十几个用户时每台机器都维护一套用户体系会让人抓狂——用户A在机器1改了密码机器2上还是旧密码ssh还得一台台同步。这时候就该上集中认证了。Ubuntu Server可以接入LDAP或FreeIPA域统一管理用户、密码策略、sudo规则。配置过程比较繁琐需要装sssd、配置/etc/sssd/conf.d/下的文件、启用NSS和PAM模块一句话说不完。我只提一下思路如果你的机器数量或用户数量已经让你感觉到“手工维护用户很痛”那就是该上集中认证的明确信号了不要等出问题再改。6.3 别忘了云平台自带的安全组配合如果你用的是云服务器阿里云、腾讯云、AWS等那么除了系统层面的用户管理云平台的“安全组”或“防火墙策略”也要一起考虑。安全组控制的是网络层面的访问系统用户控制的是系统层面的登录两层配合才完整。比如你可以创建一个专门用于运维的用户设置复杂密码和密钥然后在安全组里限制只允许公司出口IP的SSH访问这样即便用户被暴力破解攻击者也没有网络通路可用。这套组合是日常最稳妥的运维姿势。个人实际经验里用户管理最容易出问题的往往不是命令不会敲而是对“权限变化什么时候生效”没有概念或者没搞清楚“用户和组的生命周期”就贸然删改。我自己的服务器从Ubuntu 18.04一路用到24.04吃过不少亏之后才养成了一个习惯每次用户管理操作前先更新一下三个核心配置文件备份每次改权限后立刻换新终端验证效果。这套流程看起来很笨但确实能拦下绝大多数低级事故。希望这篇文章能帮你在Ubuntu用户管理这条路上少走几个弯路。