Ubuntu用户管理全攻略:从passwd文件到sudo权限与SSH密钥登录

发布时间:2026/10/8 2:41:19
Ubuntu用户管理全攻略:从passwd文件到sudo权限与SSH密钥登录
用过 Ubuntu 的人基本都遇到过这几类场景装完系统要给家人或同事建一个登录账号、公司服务器上要开一个带 sudo 的临时账号、某天自己忘了密码被挡在系统外面还有一类更加隐蔽——账号看起来一切正常可就是反复出现安装软件失败、ssh 连不上、环境变量莫名其妙报错。这些问题绕来绕去最终都会落到同一个词上用户管理。Ubuntu 的用户管理看起来就是几条命令真正深入下去才会发现细节全藏在权限模型和命令参数里。不走一遍完整流程很多坑根本想不到。这篇文章我打算把用户管理的底层文件、核心命令、完整实操步骤和常见故障排查一次性讲透新手可以照着动手操作老手也能拿来查漏补缺——特别是 sudo 授权、家目录权限、SSH 密钥对接这些环节踩过坑的人自然知道有多重要。1. 用户管理到底在管什么1.1 三个文件passwd、shadow、groupUbuntu 里所有用户信息最终都落在/etc/passwd、/etc/shadow、/etc/group三个文件上。我不建议你直接手动改这三个文件除非你非常清楚自己在做什么但理解它们的结构对排查问题帮助极大。先看/etc/passwd每一行对应一个用户用冒号分成 7 个字段用户名密码占位符通常显示为x意思是真实密码不在这里UID用户IDGID主组ID备注信息GECOS一般写真实姓名或用途主目录登录 shell我记得自己刚学 Linux 时也疑惑过为什么cat /etc/passwd能直接看到所有人却看不到任何密码。原因是密码 hash 早就被挪到了/etc/shadow这个文件普通用户没有读取权限只有 root 和部分特殊程序能访问。所以系统允许你用cat /etc/passwd查看用户列表却不允许你用同样的方式看到密码信息。/etc/shadow里每行也对应一个用户除密码 hash 外还记录密码最后修改时间、最小最大修改天数、过期警告天数等策略字段。想看的话需要执行sudo cat /etc/shadow。/etc/group是组信息含组名、组口令占位符、GID 和组成员列表。很多新手容易忽略组的作用——一个用户能访问哪些文件不只取决于他自己还取决于他属于哪些组、组与文件之间的关系。这三个文件就是用户管理的“账本”日常命令本质上都在读写它们。比如sudo useradd testuser后系统会自动往/etc/passwd和/etc/shadow各加一行把用户加到附加组则改/etc/group。如果哪一天用户管理相关命令异常了多半是这三个文件被改坏或权限出了问题。1.2 超级用户、系统用户和普通用户的边界Ubuntu 里的用户不分高低贵贱只看 UID。UID 0 是超级用户 root权限没有边界能在系统里做任何事UID 1 到 999 一般是系统用户像 sshd、www-data、mysql 这些服务账户它们通常没有可登录的 shell只用来运行对应服务从 UID 1000 开始是普通用户系统安装时建立的第一个账号一般就是 1000 号。这个划分背后是“最小权限原则”。每个服务用独立账号运行权限只给到它需要的范围出问题也只影响局部不至于整个系统被攻破。这也是为什么服务故障时第一反应应该是去看服务是以什么身份在跑而不是盲目 sudo 重启然后再观察。新手最常犯的问题一是给系统服务账户或自己的普通账号乱加 sudo二是把家目录权限随手设成 777。权限开得越宽出事概率越高。后面会专门讲 sudo 授权怎么给才算克制。2. 核心命令解析与选型理由2.1 创建账号用 adduser 还是 useraddUbuntu 里有两个命令可以创建用户交互式的adduser和底层的useradd。我日常操作中 80% 的建号场景都会用adduser因为它会一步步询问设置密码、补充备注并自动做好一堆准备工作创建家目录、按模板往家目录里放默认配置文件、设置默认 shell。useradd则接近“最小化”操作默认不会创建家目录也不设置密码适合在脚本里批量建号用。比如要给几十个服务账号批量创建用户你不可能一次次进入交互用useradd -m -s /bin/bash -g users username这种组合就干净利落。这里还有一点值得留意adduser和useradd的参数体系并不完全一致。Ubuntu 的adduser底层是一个 Perl 脚本不支持useradd里的很多底层参数反过来useradd也不会跟你交互。可以这样理解adduser是把人穿戴整齐再领进门的秘书useradd是给你一摞零件让你自己拼装的工具箱。另外/etc/skel这个目录值得认识一下。它是一个模板目录里面预置了.bashrc、.profile、.bash_logout等配置文件新建用户的家目录内容就是从这里拷贝过去的。如果你想给未来所有新建用户默认加某个配置把文件放进/etc/skel即可以后每次建号都会自动带上。这个机制很多人用了一年 Linux 都没注意过但实际维护批量账号时非常有用。2.2 密码、锁定与账号信息修改passwd不只是改密码还能锁账号、设过期策略。sudo passwd -l username会在 shadow 文件密码字段前加一个!账号立即无法登录sudo passwd -u username解锁sudo passwd -e username强制用户下次登录时修改密码。临时账号到期封禁时用锁定比直接删除更稳妥进可攻退可守。usermod用来修改已有账号。最常用的场景是加附加组sudo usermod -aG sudo username注意这里必须带-aappend否则用户会被从其他附加组里踢出去只剩 sudo 这一个组。usermod -s /bin/bash可以改登录 shellusermod -d /home/newdir可以改主目录-L和-U也能锁和解锁账号速度比 passwd 快适合脚本里执行。删除用户用userdel username加-r会连家目录和邮件目录一起删除。我个人强烈建议删除前先确认这个用户没有活动进程也没有重要文件残留否则删完再想找回数据就难了。具体的排查方法放在第 4 章里展开。2.3 用户组与 sudo 授权的关键逻辑用户组的作用是把一批用户放进同一个集合里通过组权限统一管理文件访问而不是逐个用户设置权限。比如搭内部开发环境可以先建一个dev组把团队成员都加进去共享目录的组权限一配大家就都能访问成员变化时只改组成员不用碰文件权限。sudo 的本质是让普通用户临时以其他身份默认 root执行命令。允许谁执行哪些命令配置写在/etc/sudoers里。改这个文件请务必用visudo命令打开不要直接用vi /etc/sudoers因为visudo会做语法校验防止你把整个 sudo 搞坏。配置行里最宽松的写法是username ALL(ALL:ALL) ALL意思是“任意主机、以任意用户、执行任意命令”。这是全量放权。生产环境里应该尽量收紧比如username ALL(ALL) NOPASSWD: /usr/bin/systemctl restart nginx意思是该用户执行systemctl restart nginx时不需要输密码但其他需要提权的命令仍然正常走密码验证。还有一点RHEL 系用wheel组做管理员组Ubuntu 默认用sudo组两者机制类似但名称不同。在 Ubuntu 上把用户加进wheel组没意义正确做法是加进sudo组。3. 从零到一的完整实操流程3.1 现实场景与动手前的检查假设公司新来了一个同事小刘需要在 Ubuntu 服务器上给他建一个普通账号能登录、能用 sudo并通过 SSH 密钥登录避免每天输密码。我们把这个流程完整走一遍。前提是你已经有管理员身份并且能执行 sudo。动手前先确认环境基本信息cat /etc/os-release cut -d: -f1 /etc/passwd第一条查看 Ubuntu 版本第二条列出当前机器上已有的所有用户名。知道自己在什么环境里操作再开始建号这是基本功不丢人。3.2 建号、设密码与默认文件处理执行sudo adduser liu交互过程让你输入密码、确认密码然后依次填写姓名、房间、电话、备注等信息。不想填的可以直接回车跳过最后输入y确认。这一步完成后系统会自动创建/home/liu并复制/etc/skel下默认的.bashrc、.profile等文件到家目录默认 shell 一般是 bash。可以用id liu看到类似uid1001(liu) gid1001(liu) groups1001(liu)的输出当前用户只有自己的主组。3.3 配置 sudo 和用户级环境变量只建账号不加组小刘目前没有管理员权限。这一步执行sudo usermod -aG sudo liu然后切换验证sudo su - liu sudo whoami如果输出root说明 sudo 授权生效。第一次使用 sudo 时系统会提示输入当前用户密码这是正常的校验流程。接下来配置用户级环境变量。小刘之后要装软件、配环境最常见的是往~/.bashrc里追加 PATHecho export PATH$HOME/bin:$PATH ~/.bashrc source ~/.bashrc需要注意很多人遇到的“ubuntu环境变量配置错误”十有八九是改了/etc/environment或/etc/profile这种全局文件语法写错导致所有用户的环境全挂了。改系统级环境变量前先备份改完尽量在新终端里验证不要关掉当前会话再去打开新窗口才发现问题。全局配置只有管理员能碰普通用户平时用不着修改。顺便提一句有些朋友反馈“ubuntu安装gcc失败”排查到最后往往不是 gcc 本身的问题而是当前用户缺少写系统目录的权限或者PATH里丢了/usr/bin。这类问题本质上都能扯到用户权限配置上所以账号建好之后把 sudo 和 PATH 理清楚很多后续麻烦可以提前规避。3.4 SSH 密钥登录与权限细节远程服务器上给新用户配置密钥登录是常规操作。先在本地生成密钥对然后把公钥放到服务端。假设你本地已经有~/.ssh/id_rsa.pub服务端执行sudo mkdir -p /home/liu/.ssh sudo chmod 700 /home/liu/.ssh echo ssh-rsa AAAA...... | sudo tee /home/liu/.ssh/authorized_keys sudo chmod 600 /home/liu/.ssh/authorized_keys sudo chown -R liu:liu /home/liu/.ssh每一步都有讲究。.ssh目录权限必须是 700authorized_keys文件必须是 600属主必须是小刘自己。我看到过太多“ssh无法连接”的案例根本不是密码或防火墙问题而是.ssh目录权限太宽松sshd 认为不安全直接拒绝读取密钥。日志里会显示类似Authentication refused: bad ownership or modes的信息。所以别小看权限配置。如果本地 SSH 密钥已经配置好其实可以用更省事的方式ssh-copy-id liu服务器IP它会自动把公钥追加到对应用户的authorized_keys并且自动设置好目录和文件权限。不过前提是该用户能通过密码登录或者你有办法先把公钥传过去。3.5 最后的验证与移交细节流程收尾时不要只跟小刘说“建好了”至少过一遍下面几条id liu查看组成员是否包含 sudols -ld /home/liu查看家目录属主和权限用sudo su - liu切换过去感受一下登录后的 shell 环境sudo tail -n 20 /var/log/auth.log看最近登录和提权记录确认没有异常错误。移交时把日常管理习惯写清楚比如不要乱用 sudo、不要在/etc/下乱改文件、改全局配置先备份。用户管理不是建完号就结束了后续的权限习惯才是关键。4. 高频问题与排查技巧实录4.1 忘记密码应急恢复的两种思路Ubuntu 忘记登录密码是搜索热门。如果你在本地机器前最简单的方法是重启在 GRUB 菜单里选择 Advanced options进入 recovery mode选 root shell然后执行mount -o remount,rw / passwd username如果连用户名都不记得可以先在 shell 里ls /home cat /etc/passwd确认要重置哪个账号。这里最容易被忽略的是 recovery 模式下根分区默认只读所以mount -o remount,rw /这一步非常关键不执行的话写操作会失败。如果你是在远程服务器上忘了密码而 ssh 也连不上那走不了恢复模式只能靠云控制台或其他带外入口或者系统快照回滚。这也提醒了大家云服务器密码不要等忘了才处理最好一开始就配好管理员密钥密码只是兜底方案。4.2 sudo 报错的三种典型情况第一种username is not in the sudoers file。这是新手最常见的报错意思是该用户不在 sudo 组里也不在 sudoers 配置里。解决方法很简单切到 root 或其他管理员账号执行usermod -aG sudo username或者用visudo加配置行。第二种用户密码过期导致 sudo 怎么输密码都不对。优先检查 shadow 文件确认账号没有过期、密码没有处于锁定状态。第三种/etc/sudoers被改坏sudo 命令整个失效。这种情况需要死马当活马医在还没断开的终端里用 root 执行pkexec visudo或者直接通过恢复模式修复。所以平时改 sudoers 前先留备份哪怕只是cp /etc/sudoers /etc/sudoers.bak关键时刻能救命。4.3 删除用户后留下的文件与 UID 冲突删除用户时只执行了userdel username而没有加-r家目录会留下来。之后如果系统创建了一个 UID 相同的新用户这个新用户可能会“捡到”旧文件的归属权变成安全隐患。运维里这种问题叫 UID reuse。排查办法是find / -user oldusername找出所有还属于该用户的文件。如果确定不要了直接删除或改为其他用户属主如果要保留数据用chown -R newuser:newgroup /home/oldusername把归属转给新用户。删除账号之前我还习惯跑一句pgrep -u username确认没有残留进程。删了号但进程还在跑会留下一个无法归属的进程比不删还难处理。4.4 账号锁定、密码策略与审计日志临时账号用完应该立刻锁定而不是删除这样留有后悔药。方法sudo passwd -l username sudo chage -E 2026-01-01 usernamechage -E设定账号过期日期适合给外包、实习生这类有时限的账号。如果要强制用户改密码用sudo passwd -e username不然后很多用户会把初始密码用一辈子安全隐患很大。审计方面Ubuntu 的用户管理日志集中在/var/log/auth.log。里面能看到登录成功/失败、sudo 调用、用户切换。遇到异常登录行为先 grep 这个文件经常能直接找到线索。日志不是摆设是排查时最可靠的朋友。5. 长期维护的一些个人心得批量管理账号时脚本化是个大趋势但要注意交互命令和非交互命令的混用。写 shell 脚本批量建号时用useradd加chpasswd组合更合适echo username:password | sudo chpasswd比循环调passwd快得多而且不会卡在交互提示上。如果有多台服务器尽量用统一命名规范比如dev-zhangsan、svc-nginx。不然过几个月再看根本分不清这个账号是谁建的、是干嘛用的。最后分享一个小习惯每次改完用户或组配置顺手把变更记录到本地笔记或者至少保留 shell 历史。我见过太多团队半年之后要查“这个账号当初为什么建”全凭记忆结果谁都说不清。用户管理不是安全部门一个人的事每个用 Ubuntu 的人都该把账号当成自己家门口的锁一样日常多看一眼关键时候少折腾半天。