在Linux系统中查看所有用户需要分不同层次来处理。其中,“cut -d: -f1 /etc/passwd”命令只是机械地提取出全部用户名,这里面甚至包含了那些不可登录的账户;而“awk -F: '$3>=1000 && $7!~/(nologin|false)$/{print $1}'”命令则可以筛选出钱ID≥1000且shell有效的普通用户;“getent passwd”命令更为可靠,它能够兼容像LDAP等外部源。不过要注意,真正的人类用户还需要结合home目录的存在性以及密码未锁定状态进行交叉验证才行。

直接看 /etc/passwd 能列出所有已注册账户,但里面混着几十个系统服务账户(如 daemon、sshd、www-data),不能当“可登录用户”用。真要查人用的账号,得筛 UID、shell、home 目录三样东西。
只提取用户名:cut 和 awk 都行,但字段别搞错
要说获取全部用户名最快的方法,那非 cut -d: -f1 /etc/passwd 莫属了,一行命令就能搞定,不过它会把像 nobody、sync 这类根本无法登录的用户也一并吐出。因为它只是机械地提取第一列,并不会去判断其有效性。
而 awk -F: '{print $1}' /etc/passwd 这条命令的效果与之相同,但如果后续想要添加条件的话,它就更方便了,比如:awk -F: '$3 >= 1000 && $7 !~ /(nologin|false)$/{print $1}' /etc/passwd ,使用这条命令就能轻松跳过低UID和禁用shell的账户。
$3是 UID 字段,Ubuntu/Debian 普通用户从 1000 开始,RHEL/CentOS 是 500 或 1000,得按发行版调$7是 shell 字段,/sbin/nologin和/bin/false表示禁止交互登录,但有些系统用/usr/sbin/nologin,正则得覆盖全- 别碰
$2(密码占位符),它全是x,真实密码在/etc/shadow,非 root 读不了
getent passwd 比直接读 /etc/passwd 更可靠
如果你的系统配了 LDAP 或 SSSD,cat /etc/passwd 只能看到本地账户,而 getent passwd 会合并所有 NSS 后端数据,返回完整视图。它不是“替代方案”,而是生产环境该用的标准方式。
getent passwd | cut -d: -f1输出所有可解析用户,含域用户getent passwd | awk -F: '$3 >= 1000 {print $1}'筛普通用户,但注意:LDAP 用户 UID 可能远大于 65534,别硬加上限- 查单个用户是否存在,用
id username比 grep/etc/passwd准,它走的是 NSS 查询链
compgen -u 看起来快,但结果不准
compgen -u 是 Bash 内置命令,只输出当前 shell 的补全缓存里的用户名,依赖 /etc/passwd 但不实时刷新。新建用户后不重启 shell,它就看不见;删了用户,它可能还缓存着。
- 适合快速检查当前环境认识哪些名字,别用于审计或脚本依赖
- 它不查
/etc/shadow,也不管密码是否被锁(*或!),更不理会 SSH 或 sudo 权限 - 换 zsh 或 dash 就失效,纯 Bash 特性,跨 shell 不通用
真正“人类用户”还得看 home 目录和密码状态
UID ≥ 1000 + 有 bash/shell ≠ 真实用户。有人手动建低 UID 账户,或改了 shell 绕过筛选。最稳的方式是交叉验证:
ls -ld /home/* 2>/dev/null | awk '{print $3}' | sort -u列出实际有 home 目录且属主有效的用户名sudo getent shadow | awk -F: '$2 != "*" && $2 != "!" {print $1}'查密码字段没被锁的用户(需 root 权限)- 这两条结果取交集,比单靠
/etc/passwd字段靠谱得多 - 注意
getent shadow在启用了 LDAP 的机器上会返回域用户,结果可能远超预期
UID 范围、shell 类型、home 目录、密码状态这四层过滤缺一不可,漏掉任何一层都可能把服务账户当人用,或者把刚创建还没设密码的用户漏掉。