在Linux系统中,管理登录用户是系统管理员的核心任务之一,掌握相关的命令能够有效监控用户活动、管理用户会话以及排查系统问题,以下是Linux系统中与登录用户相关的常用命令及其详细用法,涵盖从查看当前用户到管理远程登录会话的多个场景。

最基础且常用的命令是who,该命令用于显示当前登录系统的用户信息,执行who命令会输出三列内容:用户名、终端设备以及登录时间,输出可能为root pts/0 2023-10-01 10:30 (192.168.1.100),表示root用户通过伪终端(pts/0)于指定时间从IP地址192.168.1.100登录。who命令还支持选项,如-u可显示用户空闲时间(若为表示当前活跃,old表示闲置超过24小时),-q则仅显示登录用户数量及用户名列表,另一个类似命令是whoami,它仅输出当前执行命令的用户名称,适合在脚本中快速确认身份。
与who功能相近的是w命令,它提供更详细的用户活动信息。w命令的输出分为两部分:上半部分显示系统整体状态,如当前时间、系统运行时长、登录用户数以及系统负载平均值;下半部分则按用户列出详细信息,包括用户名、终端、远程主机、登录时间、空闲时间、CPU时间占用的进程数以及当前执行的命令。w -h选项可隐藏标题行,便于后续处理;w -u仅显示活跃用户。w命令的优势在于能直观看到每个用户当前正在执行的程序,有助于判断系统资源占用情况。
对于需要查看当前登录用户详细信息的场景,users命令是一个轻量级选择,它仅输出当前登录的所有用户名列表,重复的用户名表示该用户有多个登录会话,虽然输出简单,但结合sort | uniq -c可统计每个用户的登录次数,例如users | sort | uniq -c会显示用户名及其对应的会话数。
当需要监控用户实时活动时,last命令非常有用,它读取/var/log/wtmp文件并显示所有登录、注销及系统重启的历史记录,输出内容包括用户名、终端、远程主机、登录时间、持续时间及退出状态。last root可查看root用户的登录历史,last -n 10限制显示最近10条记录。lastb命令则类似,但读取的是/var/log/btmp文件,记录失败的登录尝试,常用于安全审计,通过last和lastb,管理员可以追溯异常登录行为,排查潜在安全风险。

在多用户环境中,管理用户会话是重要任务。loginctl命令(基于systemd)提供了强大的会话管理功能,例如loginctl list-sessions列出所有会话ID,loginctl user-status <用户名>显示指定用户的所有会话信息,包括会话ID、对象路径、活跃状态及显示服务。loginctl terminate-session <会话ID>可强制终止指定会话,适用于踢出非法用户,对于传统系统,pkill -u <用户名>命令可根据用户名终止其所有进程,但需谨慎使用,以免影响系统稳定性。
远程登录用户的管理同样重要。ss或netstat命令可查看网络连接状态,例如ss -tunap | grep ssh显示所有SSH连接,包括远程IP地址和端口,结合grep可筛选特定用户的连接,如ss -tunap | grep <用户名>,若需限制用户登录,可通过/etc/passwd文件修改用户登录Shell为/sbin/nologin(如usermod -s /sbin/nologin <用户名>),或使用/etc/hosts.allow和/etc/hosts.deny配置TCP Wrappers控制访问。
以下表格总结了上述核心命令的用途及常用选项:
| 命令 | 主要用途 | 常用选项及说明 |
|---|---|---|
who |
查看当前登录用户基本信息 | -u显示空闲时间;-q显示用户数量及用户名列表 |
w |
查看用户详细活动及系统负载 | -h行;-u仅显示活跃用户 |
users |
显示当前登录用户名列表 | 无,可结合sort | uniq -c统计会话数 |
last |
查看登录历史记录 | -n <数字>限制显示条数;<用户名>筛选特定用户 |
lastb |
查看失败登录记录 | 无,常用于安全审计 |
loginctl |
管理用户会话(systemd系统) | list-sessions列出会话;terminate-session <ID>终止会话 |
ss |
查看网络连接状态 | -tunap显示所有TCP/UDP端口及进程;结合grep筛选用户连接 |
一些高级技巧也能提升管理效率,通过cat /proc/loadavg可快速查看系统负载,结合uptime命令获取简化的负载信息;若需实时监控用户命令输入,可使用script命令记录会话,如script -a session.log,所有终端操作将被保存到文件中;对于批量操作,可编写Shell脚本结合for循环和上述命令,例如自动检测长时间闲置的会话并发送警告。

在实际应用中,命令组合使用能发挥更大作用。who | awk '{print $1}' | sort | uniq -c可统计当前每个用户的登录会话数;last | grep "still logged in"可查看当前仍在线的历史登录记录;journalctl -u ssh | grep "Failed password"则通过systemd日志分析SSH登录失败事件,这些组合命令能帮助管理员快速定位问题,提高工作效率。
需要注意的是,部分命令(如last、lastb)读取的日志文件可能因系统配置不同而位置或格式有所差异,例如在Ubuntu系统中,/var/log/wtmp可能由acct或utmpwatch服务维护,需确保相关服务正常运行,在生产环境中执行敏感操作(如终止用户会话)前,建议先备份重要数据,并通过pgrep或ps命令确认目标进程,避免误操作。
相关问答FAQs:
Q1: 如何查看某个特定用户的登录历史记录,包括登录时间和IP地址?
A1: 使用last命令结合用户名即可查看,具体格式为last <用户名>。last john会显示用户john的所有登录历史,包括登录时间、终端、来源IP地址及退出状态,若需进一步筛选,可通过管道传递给grep,如last john | grep "192.168.1"查看来自特定IP的登录记录,注意,该命令读取的是/var/log/wtmp文件,需确保日志文件未被清理。
Q2: 如何强制踢出某个已登录的用户,并终止其所有进程?
A2: 可通过loginctl或pkill命令实现,若系统使用systemd,优先使用loginctl:首先执行loginctl list-sessions找到目标用户的会话ID,然后运行loginctl terminate-session <会话ID>,对于非systemd系统,可使用pkill -u <用户名>终止该用户的所有进程,但此方法会强制关闭用户所有活动,可能导致未保存的数据丢失,建议在操作前通过who或w命令确认用户会话,并在必要时提前通知用户。
