Linux查看所有用户需分层次:cut -d: -f1 /etc/passwd仅机械提取全部用户名(含不可登录账户);awk -F: '$3>=1000 && $7!~/(nologin|false)$/{print $1}'筛选UID≥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 后端数据,返回完整视图。它不是“替代方案”,而是生产环境该用的标准方式。
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
-
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 目录、密码状态这四层过滤缺一不可,漏掉任何一层都可能把服务账户当人用,或者把刚创建还没设密码的用户漏掉。

















