1. 项目概述:为什么在 Ubuntu 上“看用户”不是简单 ls 一下就完事?
在 Ubuntu 系统里敲 cat /etc/passwd ,屏幕上哗啦啦滚出几十上百行带冒号的字符串——这确实是“看到系统用户”的最原始动作。但如果你真以为这就完成了任务,那大概率会在三分钟内被自己搞懵: root:x:0:0:root:/root:/bin/bash:/usr/sbin/nologin 这一行里, /bin/bash 和 /usr/sbin/nologin 到底哪个才是登录 shell? 0:0 是 UID 和 GID,可 daemon 用户 UID 是 1, sys 是 3, sync 是 4……这些数字谁先谁后、有没有空缺、能不能改?更关键的是, nobody 和 systemd-network 这些名字听着像人,但它们根本不能登录,连密码都没有,算不算“系统用户”?
这就是标题 “How To View System Users in Linux on Ubuntu” 背后真正要解决的问题: 它不是教你怎么翻文件,而是帮你建立一套可判断、可筛选、可验证的用户认知框架 。你面对的不是一串静态文本,而是一个运行中的权限与身份管理系统。Ubuntu 的用户体系分三层:底层存储( /etc/passwd )、密码凭证( /etc/shadow ,加密哈希)、组关系( /etc/group )。只看 passwd,就像只看户口本不查身份证和社保记录——你知道有这个人,但不知道他能不能进大门、能开哪几扇门、跟谁是一伙的。
我刚接手一个客户服务器时,运维给的交接文档写着“已禁用所有非必要账户”,结果我用 getent passwd | awk -F: '$7 !~ /(nologin|false)$/ {print $1,$3,$7}' 一扫,发现 backup 用户 UID=34,shell 是 /bin/bash ,且没被加到 sudo 组——但它在 /etc/shadow 里密码字段是 * (锁定),而 cron 用户 shell 是 /usr/sbin/nologin ,却在 shadow 里密码字段是 ! (显式禁用)。这两个状态在安全审计里意义完全不同: * 表示账户被 passwd -l 锁定,仍可被服务调用; ! 表示 usermod -L 彻底抹除密码哈希,连 PAM 认证都绕不过去。你看,同一行 passwd 数据,不结合 shadow 和实际策略,根本没法下结论。
所以这篇内容的核心价值,是给你一套“解剖刀”:从命令怎么选、参数为什么这么设、输出字段怎么读、异常状态怎么判,到最终形成一份可交付的用户清单报告。它适合三类人:刚装完 Ubuntu 想搞懂系统结构的新手(别再死记硬背 id 命令了);需要定期做安全巡检的中小团队运维(省掉写 Python 脚本的时间);还有正在备考 LPIC-1 或 RHCSA 的考生(考试里必考 getent 和 awk 组合技)。接下来的所有操作,都围绕一个原则: 让每一条命令的输出,都能直接回答一个具体问题——比如“哪些用户能交互式登录?”、“哪些账户是纯服务账户?”、“UID 在 1000 以下的用户里,谁的主目录不在 /home 下?” 。
2. 核心思路拆解:为什么不用 ls /home ?为什么 who 不是答案?
很多人第一反应是 ls /home ——毕竟用户主目录都在那儿。但这是个典型误区。 /home 目录只存放 交互式用户的主目录 ,而 Ubuntu 系统里大量服务账户(如 www-data , mysql , dnsmasq )压根没有 /home 下的目录,它们的主目录通常是 /var/www , /var/lib/mysql , /var/lib/misc 这类路径。 ls /home 只能看到“住家户”,漏掉了“单位集体宿舍住户”。更危险的是,有人手动创建了 /home/testuser 但没在 /etc/passwd 里添加记录——这个目录对系统而言就是个普通文件夹, ls 出来反而会误导你认为存在一个有效用户。
再看 who 或 w 命令。它们显示的是 当前已登录的会话 ,本质是读取 /var/run/utmp 文件。这只能告诉你“此刻谁在线”,完全无法反映系统里“有哪些账户被创建过”。比如 root 用户可能常年不登录,但它是最高权限账户; sshd 用户是 OpenSSH 服务专用账户,永远不登录,但删掉它 SSH 就瘫痪。用 who 查用户,就像查酒店入住登记表来统计常住人口——数据实时但片面。
真正的解法必须直击源头: /etc/passwd 是 Linux 用户数据库的 唯一权威源 (除 LDAP/NIS 外)。它按固定格式存储每个用户的核心元数据,每行 7 个冒号分隔字段: 用户名:密码占位符:UID:GID:描述:主目录:登录shell 。注意第二字段是 x 或 * ,真实密码哈希在 /etc/shadow ,这是为安全做的分离设计。Ubuntu 默认启用 shadow 密码,所以 passwd 文件里看不到明文或哈希。
那么为什么不直接 cat /etc/passwd ?因为原始输出信息密度过高,且混杂了三类用户:
- 超级用户 (UID=0,只有
root) - 系统用户 (UID 1–999,Ubuntu 定义为
system users,用于运行服务) - 普通用户 (UID ≥1000,Ubuntu 默认从 1000 开始分配,对应桌面用户)
getent passwd 是更优解,因为它能统一查询本地文件、NIS、LDAP 等多种后端,且输出格式与 /etc/passwd 完全一致,兼容所有解析脚本。而 compgen -u 只列出用户名,丢掉了 UID、shell 等关键字段,属于“知道名字但不知底细”。
工具链选择逻辑如下:
- 基础筛查用
getent passwd:获取完整、标准、可解析的原始数据流; - 字段提取用
awk:比cut更灵活,能写条件判断(如$7 ~ /bash$/); - 过滤排序用
sort+grep:sort -t: -k3,3n按第三字段(UID)数值排序,grep -v 'nologin'排除无登录能力账户; - 人工验证用
id和getent shadow:对关键账户做二次确认,避免配置漂移。
这个组合不是炫技,而是生产环境验证过的最小可靠集。我管理过 200+ 台 Ubuntu 服务器,所有用户审计脚本都基于此
386



被折叠的 条评论
为什么被折叠?



