Unix who命令是系统管理员和普通用户日常工作中非常基础且实用的工具,主要用于显示当前登录系统的用户信息,通过这个命令,用户可以快速了解当前有哪些人正在使用系统,他们的登录终端、登录时间以及从哪里登录等信息,对于系统监控、用户管理和安全审计都有着重要的意义,下面将详细介绍who命令的功能、使用方法、输出格式以及相关选项。

who命令的基本用法非常简单,直接在终端输入who即可,默认情况下,命令会输出三列信息:第一列是用户名,即登录系统的账户名称;第二列是终端名,用户是通过哪个终端或伪终端登录的,例如tty1表示本地物理终端,pts/0表示虚拟终端;第三列是登录时间,包括日期和时间,当用户执行who命令后,可能会看到类似“user1 tty1 2023-10-01 09:30”这样的输出,这表示user1用户在10月1日9:30通过tty1终端登录了系统。
除了默认输出,who命令还提供了多种选项来扩展其功能,满足不同场景下的需求,通过结合不同的选项,用户可以获取更详细或特定格式的信息,以下是一些常用的选项及其作用:
-
-a或--all:显示所有可用的信息,包括用户的登录名、终端、登录时间、空闲时间、进程ID、用户的主机名或IP地址以及用户登录时所使用的终端类型,这个选项会输出最全面的用户登录信息,适合需要进行详细审计的场景。
-
-b或--boot:显示系统最后一次启动的时间,这个选项对于了解系统的运行时间非常有帮助,可以快速判断系统是否重启过以及重启的时间点。
(图片来源网络,侵删) -
-d或--dead:显示所有已死的进程信息,在Unix系统中,有些登录进程可能会异常终止,导致用户虽然显示为登录状态,但实际上进程已经不存在,使用此选项可以找出这些“僵尸”登录,帮助清理无效的登录记录。
-
-H或--heading:在输出信息的第一行显示列标题,当输出信息较多时,使用此选项可以更清晰地理解每一列数据的含义,提高可读性。
-
-l或--login:显示登录系统的所有进程信息,包括登录shell和init进程等,这个选项会列出更多的系统进程信息,不仅仅是用户登录会话。
-
-m:仅显示与当前终端相关的用户信息,相当于执行who am i命令的效果,只显示当前用户自己的登录信息,包括用户名、终端和登录时间。
-
-q或--count:显示当前登录系统的用户数量以及所有用户名列表,这个选项以简洁的方式显示用户总数,并列出所有在线用户,适合快速查看系统负载情况。
-
-s或--short:使用短格式输出信息,这是默认的输出格式,只显示用户名、终端和登录时间三列信息。
-
-t或--time:显示系统最后一次更改当前时间的时间戳,这个选项可以用于了解系统时间是否被修改过以及修改的时间。
-
-u或--users:显示当前登录用户的详细信息,包括用户名、终端、登录时间、空闲时间和用户进程ID,与默认输出相比,增加了空闲时间和进程ID信息,空闲时间表示用户最后一次操作终端后经过的时间,有助于判断用户是否活跃。
-
-T或--mesg或+w:显示用户的终端状态,终端状态可以是“+”表示终端可接收消息,“-”表示终端不可接收消息,“?”表示状态未知,这个选项对于需要向用户发送消息的场景非常有用,可以先检查终端状态再决定是否发送。
-
-w或--mesg:与-T选项类似,显示用户的终端状态。
-
--ips:显示用户登录时使用的IP地址,而不是主机名,如果系统配置了主机名解析,使用此选项可以直接显示IP地址,避免解析延迟。
-
--lookup:尝试将主机名解析为IP地址,并显示IP地址,与--ips选项不同,此选项会先尝试解析主机名,如果解析失败则显示主机名。
-
--message:与-T选项相同,显示终端状态。
-
--writable:与-T选项相同,显示终端是否可写。
-
--help:显示who命令的帮助信息,列出所有可用的选项及其说明。
-
--version:显示who命令的版本信息。
为了更直观地理解who命令的输出格式,以下是一个示例表格,展示了不同选项下可能的输出结果:
| 选项 | 输出示例 | 说明 |
|---|---|---|
| 默认(无选项) | user1 tty1 2023-10-01 09:30 | 显示用户名、终端和登录时间 |
| -a | user1 tty1 2023-10-01 09:30 . 12345 (00:10) 192.168.1.100 | 显示所有信息,包括空闲时间、进程ID和IP地址 |
| -b | system boot 2023-09-30 14:20 | 显示系统最后一次启动时间 |
| -d | dead_process pts/2 2023-10-01 10:00 (00:05) 54321 | 显示已死的进程信息 |
| -H | USER LINE TIME IDLE PID COMMENT | |
| -m | user1 pts/0 2023-10-01 09:35 | 显示当前用户的登录信息 |
| -q | 2 users: user1 user2 | 显示用户数量和用户名列表 |
| -u | user1 pts/0 2023-10-01 09:35 00:15 12345 | 显示用户详细信息,包括空闲时间和进程ID |
| -T | user1 + pts/0 2023-10-01 09:35 | 显示用户名和终端状态 |
| --ips | user1 pts/0 2023-10-01 09:35 192.168.1.100 | 显示用户登录的IP地址 |
在实际使用中,who命令常常与其他命令结合使用,以实现更复杂的系统管理任务,通过管道将who命令的输出传递给grep命令,可以筛选特定用户的登录信息;结合awk或cut命令,可以提取特定的列信息;使用sort命令可以对输出结果进行排序,要查看当前所有登录用户的IP地址,可以使用“who --ips | awk '{print $1, $5}'”命令;要按登录时间倒序显示用户信息,可以使用“who -u | sort -k3 -r”命令。
who命令的输出信息来源于系统的/var/run/utmp或/var/log/wtmp文件,utmp文件记录了当前登录系统的用户信息,而wtmp文件则记录了所有用户的登录和注销历史,是一个持久化的日志文件,who命令默认读取utmp文件来获取当前登录用户的信息,而使用who -w或who --lookup等选项时,可能会涉及到wtmp文件的读取,了解这些文件的存储位置和格式,有助于更深入地理解who命令的工作原理。
对于系统管理员来说,who命令是监控系统安全的重要工具之一,通过定期检查who命令的输出,可以及时发现异常登录行为,例如某个用户在不应该登录的时间段登录,或者有来自未知IP地址的登录尝试,结合其他安全工具,如last命令(查看登录历史记录)和fail2ban(防止暴力破解),可以构建更完善的系统安全防护体系。
对于普通用户来说,who命令可以帮助他们了解当前系统的使用情况,例如在共享服务器上,可以通过who命令查看是否有其他用户正在使用同一个终端,或者确认自己的登录会话是否正常,使用who am i命令可以确认当前登录的用户身份和终端信息,避免在多用户环境下误操作。
需要注意的是,who命令显示的信息可能会受到系统配置的影响,如果系统配置了PAM(可插拔认证模块),可能会影响登录信息的记录方式;如果使用了SSH等远程登录方式,终端信息会显示为pts/0等虚拟终端,而不是本地终端,某些Unix-like系统(如Linux、BSD、Solaris等)的who命令实现可能略有不同,具体选项和输出格式可能会有细微差别,建议通过man who命令查看当前系统的详细文档。
who命令作为Unix系统中的基础工具,虽然简单,但功能强大且实用,掌握who命令的使用方法,对于提高系统管理效率和保障系统安全具有重要意义,无论是系统管理员还是普通用户,都应该熟练掌握这个命令的基本用法和常用选项,以便在日常工作中快速获取所需的用户登录信息。
相关问答FAQs:
-
问:如何使用who命令查看当前登录用户的IP地址? 答:可以使用who命令的--ips选项来显示用户登录时使用的IP地址,在终端输入“who --ips”,命令会输出用户名、终端、登录时间和IP地址等信息,如果系统没有启用IP地址记录功能,或者用户是通过本地终端登录的,可能不会显示IP地址,也可以使用“who | awk '{print $1, $5}'”命令来提取用户名和第五列的信息(在默认情况下,第五列可能是主机名或IP地址,具体取决于系统配置)。
-
问:who命令和w命令有什么区别? 答:who命令主要用于显示当前登录系统的用户信息,包括用户名、终端、登录时间等,输出格式相对简单,而w命令是who命令的增强版,除了显示who命令的信息外,还显示了系统负载、当前运行的任务数、每个用户的当前进程以及CPU和内存的使用情况等更详细的信息,w命令的输出通常包括系统负载平均值、当前时间、系统运行时间、登录用户数以及每个用户的用户名、终端、登录时间、空闲时间、JCPU(进程执行时间)、PCPU(当前进程执行时间)和当前执行的命令等信息,w命令更适合用于监控系统的整体运行状态和用户的活动情况,而who命令则更适合快速查看当前登录用户的基本信息。
