在CentOS这类企业级Linux服务器操作系统中,用户管理是系统安全和日常运维的核心环节,无论是排查安全问题、分配资源权限,还是进行系统审计,管理员都需要熟练掌握查看系统用户信息的各种方法,本文将系统性地介绍在CentOS上查看用户信息的多种途径,从基础命令到深层文件解析,帮助您全面理解用户管理的机制。

理解CentOS的用户存储机制
在直接使用命令之前,理解CentOS是如何存储用户信息的至关重要,这不仅能帮助您更好地使用命令,还能在出现问题时进行深层次的排查,用户信息主要存储在以下几个关键文件中。
/etc/passwd 文件
这是系统中最核心的用户信息文件,每一行代表一个用户账号,无论该用户能否登录,它是一个文本文件,任何用户都可以读取,其格式通过冒号(:)分为七个字段,具体结构如下表所示:
| 字段顺序 | 字段名称 | 描述 | 示例 |
|---|---|---|---|
| 1 | 用户名 | 登录系统时使用的名称,唯一。 | john |
| 2 | 密码占位符 | 早期用于存放加密密码,现在统一存放在/etc/shadow文件中,此处通常用x表示。 |
x |
| 3 | 用户ID (UID) | 用户的唯一数字标识符,root用户的UID为0,系统用户UID通常小于1000,普通用户UID大于等于1000。 | 1000 |
| 4 | 组ID (GID) | 用户默认所属组的唯一标识符。 | 1000 |
| 5 | 注释信息 | 通常用于存储用户的全名、联系方式等描述性信息。 | John Doe, Room 101 |
| 6 | 主目录 | 用户登录后默认所在的目录。 | /home/john |
| 7 | 登录Shell | 用户登录后启动的Shell程序,若设置为/sbin/nologin,则该用户无法通过Shell登录系统。 |
/bin/bash |
/etc/shadow 文件
此文件用于存储用户的加密密码和密码策略信息,只有root用户有读取权限,极大地增强了系统的安全性,其字段同样由冒号分隔,包含登录名、加密密码、上次修改日期、最小密码间隔、最大密码有效期、警告时间、账户禁用时间等信息。
/etc/group 文件
该文件用于管理用户组信息,记录了组名、组密码(通常为空)、GID以及组成员列表。
实用命令:查看用户信息
掌握了底层文件结构后,我们可以使用各种命令来高效地获取用户信息。
基础命令:查看当前登录用户
如果您只想知道当前有哪些用户登录到了服务器,可以使用以下命令:
who:显示当前登录的用户名、登录终端、登录时间以及来源IP地址。$ who john pts/0 2025-10-27 10:15 (192.168.1.100) root tty1 2025-10-27 09:00
w:who命令的增强版,除了显示who的信息外,还会显示用户正在执行的命令、系统负载、空闲时间等更详细的信息。$ w 10:20:01 up 1 day, 1:15, 2 users, load average: 0.00, 0.01, 0.05 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT john pts/0 192.168.1.100 10:15 4.00s 0.10s 0.01s -bash root tty1 09:00 1:20m 0.04s 0.04s -bash
users:一个非常简洁的命令,仅列出当前所有登录用户的用户名,用空格隔开。$ users john root
核心方法:列出所有系统用户
要查看系统中存在的所有用户(包括无法登录的系统服务用户),最直接的方法是解析/etc/passwd文件。
-
使用
cut命令 这是最经典的方法之一,通过cut命令提取每行的第一个字段(用户名)。$ cat /etc/passwd | cut -d: -f1 root bin daemon ... john
这里,
-d:指定冒号为分隔符,-f1表示提取第一个字段。
-
使用
getent命令(推荐)getent(get entries)是一个更现代、更可靠的工具,它不仅会查询/etc/passwd等本地文件,还会从网络信息服务(如NIS、LDAP)中获取用户信息,因此在复杂的网络环境中更为通用。$ getent passwd | cut -d: -f1
其输出与直接
cat /etc/passwd相似,但适用范围更广。
筛选普通用户与系统用户
在实际管理中,我们通常更关心可交互登录的普通用户,可以通过UID来区分它们,在CentOS 7及以后版本中,普通用户的UID通常从1000开始。
-
使用
awk命令筛选普通用户awk是一个强大的文本处理工具,非常适合此类任务。$ getent passwd | awk -F: '$3 >= 1000 { print $1 }' john此命令的含义是:以冒号为分隔符(
-F:),如果第三个字段(UID)大于等于1000,则打印第一个字段(用户名)。 -
筛选系统用户 同理,筛选UID小于1000的用户即可得到系统用户。
$ getent passwd | awk -F: '$3 < 1000 { print $1 }' root bin daemon ...
检查特定用户的详细信息
当您需要关注某个特定用户时,以下命令非常有用:
-
id [用户名]:显示指定用户的UID、GID以及其所属的所有组。$ id john uid=1000(john) gid=1000(john) groups=1000(john),10(wheel)
这表明用户
john属于主组john,并且也是wheel组的成员。 -
groups [用户名]:专门用于显示用户所属的组。$ groups john john : john wheel
-
finger [用户名](可能需要安装yum install finger):提供更丰富的用户信息,包括真实姓名、主目录、登录Shell、空闲时间、邮件状态以及最近登录记录。
审计与安全:查看用户登录历史
了解谁在何时登录过系统,对于安全审计至关重要。

last:读取/var/log/wtmp文件,显示用户最近的登录历史记录,包括成功登录和重启记录。$ last john pts/0 192.168.1.100 Fri Oct 27 10:15 still logged in root tty1 Fri Oct 27 09:00 still logged in reboot system boot 5.4.17-2136... Fri Oct 27 08:59 still running ...
lastb:读取/var/log/btmp文件,专门用于显示失败的登录尝试,这是排查暴力破解攻击的首选命令,需要root权限执行。$ sudo lastb sshd:nobody :1 Sat Oct 28 11:20 - 11:20 (00:00) admin ssh:notty Sat Oct 28 11:15 - 11:15 (00:00) ...
通过以上命令和文件解析的结合,您可以全面地掌握CentOS系统中的用户状态、权限和活动情况,从快速查看当前在线用户,到深入分析所有账户的构成,再到追溯历史登录行为,这些工具构成了系统管理员日常工作中不可或缺的技能组合。
相关问答FAQs
Q1: 我使用 cat /etc/passwd 看到了很多不认识的用户,bin, daemon, nobody 等,这些是什么?它们能登录我的服务器吗?
A: 这些用户是系统用户或伪用户,它们并非供真人登录交互使用,而是为了运行特定的系统服务或守护进程(daemon)。web服务器(如Nginx或Apache)可能会以nginx或apache用户身份运行,数据库服务(如MySQL)可能会以mysql用户身份运行,这样做是为了遵循“最小权限原则”,即使服务被攻破,攻击者也只能获得该系统用户的有限权限,而不会危及整个系统。
您可以通过查看它们的登录Shell来确认,这些用户的Shell字段被设置为/sbin/nologin或/bin/false,这意味着任何尝试用这些用户名登录的行为都会被立即拒绝,它们的存在是正常且安全的,是Linux系统设计的一部分。
Q2: 我发现了一个不再需要的用户账户,如何安全地禁用它而不是直接删除?
A: 直接删除用户(userdel)可能会导致该用户拥有的文件成为“孤儿文件”(所有者UID变为一个数字),管理起来比较麻烦,一个更安全、更灵活的方法是禁用其登录权限,您可以通过修改用户的登录Shell来实现这一点。
使用 usermod 命令将用户的Shell改为 /sbin/nologin:
sudo usermod -s /sbin/nologin username
将 username 替换为您想禁用的实际用户名。
执行此命令后,当该用户尝试通过SSH或其他方式登录时,系统会显示类似“This account is currently not available.”的消息并拒绝登录,这样做的好处是:
- 该用户的所有文件和配置都保持不变,UID和GID也保留。
- 如果将来需要重新启用该账户,只需将其Shell改回
/bin/bash即可。 - 任何以该用户身份运行的系统服务(如果存在)不会受到影响。
这是一种非常常用且推荐的账户管理实践。