【Shell 命令集合 系统管理 】Linux 显示目前登入系统的用户信息 w命令 使用指南

简介: 【Shell 命令集合 系统管理 】Linux 显示目前登入系统的用户信息 w命令 使用指南

Shell 命令专栏:Linux Shell 命令全解析


描述


w命令是Linux系统中的一个实用工具,用于显示当前系统上登录的用户信息。它提供了关于每个用户的详细信息,包括登录名、终端、登录时间、运行时间和所执行的命令。

w命令的输出通常包含以下列:

  1. 用户名(USER):显示当前登录的用户名。
  2. 终端(TTY):显示用户所使用的终端设备,例如tty1、pts/0等。
  3. 远程主机(FROM):如果用户是通过远程连接登录的,则显示远程主机的IP地址或主机名。
  4. 登录时间(LOGIN@):显示用户登录系统的时间。
  5. 登录时长(IDLE):显示用户最后一次活动以来的时间,如果用户一直处于活动状态,则显示运行时间。
  6. JCPU:显示所分配给用户的CPU时间。
  7. PCPU:显示所分配给进程的CPU时间。
  8. 命令(WHAT):显示用户当前正在执行的命令或进程。

通过w命令,系统管理员可以方便地查看当前登录的用户信息,包括他们的活动状态、登录时间和所执行的命令。这对于监控系统的使用情况、检查用户活动和排查问题非常有用。


语法格式

w [选项] [用户名]

参数说明

  • -h, --no-header:不显示标题行。
  • -u, --users:显示用户的进程和CPU使用情况。
  • -s, --short:以短格式显示信息,只显示用户名、终端和登录时间。
  • -f, --from:显示用户的登录来源。
  • -i, --ip-addr:显示用户的IP地址。
  • -V, --version:显示w命令的版本信息。
  • 用户名:只显示指定用户名的信息。

错误情况

  • 如果没有登录用户,则w命令将不会输出任何信息。
  • 如果指定的用户名不存在或没有登录用户与该用户名相关联,则会显示相应的错误信息。
  • 如果使用无效的选项或参数,则会显示错误信息并给出相应的提示。

注意:在某些Linux发行版中,w命令可能需要root或sudo权限才能正常工作。否则,可能会收到权限不足的错误信息。

注意事项

在使用Linux Shell的w命令时,有一些注意事项需要牢记:

  1. 权限要求:w命令通常需要root或sudo权限才能正常工作,因为它涉及到查看其他用户的信息。如果没有足够的权限,可能会收到权限不足的错误信息。
  2. 输出信息:w命令输出的信息非常详细,包含了用户的登录时间、活动状态、终端等信息。在查看信息时,要确保对于其他用户的信息是有权限查看的,并且要遵守隐私保护的原则。
  3. 参数使用:根据自己的需求选择合适的参数来使用w命令。例如,使用-h参数可以隐藏标题行,使用-u参数可以查看用户的进程和CPU使用情况等。
  4. 用户名指定:可以通过在命令后面指定用户名来只显示特定用户的信息。但要注意,只能查看当前登录用户或具有相同权限的其他用户的信息。如果指定的用户名不存在或没有登录用户与该用户名相关联,则会显示相应的错误信息。
  5. 空闲时间和活动状态:w命令输出的信息中包含了用户的空闲时间和活动状态。空闲时间表示用户最后一次活动以来的时间,活动状态可以是idle(空闲)、running(运行中)或unknown(未知)。通过观察空闲时间和活动状态,可以了解用户的活动情况。
  6. 版本信息:可以使用-V参数查看w命令的版本信息。
  7. 结果解读:在查看w命令的输出结果时,要注意理解各列的含义和格式。例如,终端可能显示为tty1、pts/0等,登录时间可能以24小时制显示,活动状态可能显示为idle、running或unknown等。

总之,在使用w命令时,要确保有足够的权限,遵守隐私保护原则,并正确理解和解读命令的输出结果。这样才能更好地利用w命令来监控和管理系统中的用户信息。


底层实现

w命令底层是通过读取系统文件和进程信息来获取用户登录信息的。具体实现方式如下:

  1. w命令首先读取系统文件/var/run/utmp,该文件记录了当前登录用户的信息。它包含了每个登录用户的用户名、终端设备、登录时间等。
  2. w命令还会读取系统文件/var/log/wtmp,该文件记录了用户登录和注销的历史记录。通过读取wtmp文件,w命令可以获取用户的登录历史信息。
  3. w命令通过读取/proc目录下的进程信息,获取用户的进程和CPU使用情况。它会遍历/proc目录下的每个进程文件夹,读取相应的进程状态文件,从中提取出用户的进程信息。
  4. w命令根据读取到的信息,进行格式化处理,并输出到终端。

需要注意的是,w命令的具体实现可能会因不同的Linux发行版而有所差异,但基本原理是相似的。它通过读取系统文件和进程信息,获取用户登录和活动情况的详细信息,并将其展示给用户。这样,系统管理员就可以方便地监控和管理系统中的用户活动。


示例

示例一

1. w

输出当前系统上所有登录用户的信息。

示例二

2. w -h

以简洁模式显示当前系统上所有登录用户的信息,不显示标题行。

示例三

3. w -u

显示当前系统上所有登录用户的详细信息,包括用户的进程和CPU使用情况。

示例四

4. w -s

以短格式显示当前系统上所有登录用户的信息,只显示用户名、终端和登录时间。

示例五

5. w -f

显示当前系统上所有登录用户的详细信息,包括用户名、终端、登录时间、登录时长和所执行的命令。

示例六

6. w user1

只显示用户名为user1的用户的信息。

示例七

7. w -i

显示当前系统上所有登录用户的详细信息,并在空闲时间列中显示用户的活动状态(idle、running或unknown)。


用c语言实现


以下是一个用C语言实现w命令的示例代码:

#include <stdio.h>
#include <utmp.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>
int main() {
    struct utmp *ut;
    time_t currentTime;
    char timeString[20];
    
    // 打开utmp文件
    FILE *fp = fopen("/var/run/utmp", "r");
    if (fp == NULL) {
        perror("Error opening utmp file");
        exit(1);
    }
    
    // 读取utmp文件中的记录
    while ((ut = getutent()) != NULL) {
        // 过滤掉非登录记录
        if (ut->ut_type != USER_PROCESS) {
            continue;
        }
        
        // 获取登录时间
        currentTime = ut->ut_tv.tv_sec;
        strftime(timeString, sizeof(timeString), "%Y-%m-%d %H:%M", localtime(&currentTime));
        
        // 输出用户名、终端和登录时间
        printf("%-8s %-12s %s\n", ut->ut_user, ut->ut_line, timeString);
    }
    
    // 关闭utmp文件
    fclose(fp);
    
    return 0;
}

这段代码使用了头文件中的结构体struct utmp和函数getutent(),以及头文件中的函数localtime()strftime()来处理时间格式化。代码的主要逻辑是打开utmp文件,读取其中的记录,并根据记录的类型过滤非登录记录。然后,获取登录时间并格式化输出用户名、终端和登录时间。

需要注意的是,这段代码仅实现了w命令的一小部分功能,只能输出登录用户的用户名、终端和登录时间,并没有包括其他信息,如空闲时间、活动状态等。要完整实现w命令的功能,还需要读取其他系统文件和进程信息,并进行相应的处理。


结语

在我们的探索过程中,我们已经深入了解了Shell命令的强大功能和广泛应用。然而,学习这些技术只是开始。真正的力量来自于你如何将它们融入到你的日常工作中,以提高效率和生产力。

心理学告诉我们,学习是一个持续且积极参与的过程。所以,我鼓励你不仅要阅读和理解这些命令,还要动手实践它们。尝试创建自己的命令,逐步掌握Shell编程,使其成为你日常工作的一部分。

同时,请记住分享是学习过程中非常重要的一环。如果你发现本博客对你有帮助,请不吝点赞并留下评论。分享你自己在使用Shell命令时遇到的问题或者有趣的经验,可以帮助更多人从中学习。

此外,我也欢迎你收藏本博客,并随时回来查阅。因为复习和反复实践也是巩固知识、提高技能的关键。

最后,请记住:每个人都可以通过持续学习和实践成为Shell编程专家。我期待看到你在这个旅途中取得更大进步!

目录
相关文章
|
11天前
|
运维 安全 Linux
Linux中传输文件文件夹的10个scp命令
【10月更文挑战第18天】本文详细介绍了10种利用scp命令在Linux系统中进行文件传输的方法,涵盖基础文件传输、使用密钥认证、复制整个目录、从远程主机复制文件、同时传输多个文件和目录、保持文件权限、跨多台远程主机传输、指定端口及显示传输进度等场景,旨在帮助用户在不同情况下高效安全地完成文件传输任务。
100 5
|
11天前
|
Linux
Linux系统之expr命令的基本使用
【10月更文挑战第18天】Linux系统之expr命令的基本使用
42 4
|
1天前
|
Linux Shell 数据安全/隐私保护
|
2天前
|
域名解析 网络协议 安全
|
9天前
|
监控 Linux Shell
|
8天前
|
运维 监控 网络协议
|
12天前
|
Unix Linux
Linux | Rsync 命令:16 个实际示例(下)
Linux | Rsync 命令:16 个实际示例(下)
25 3
Linux | Rsync 命令:16 个实际示例(下)
|
16天前
|
Ubuntu Linux 测试技术
Linux系统之Ubuntu安装cockpit管理工具
【10月更文挑战第13天】Linux系统之Ubuntu安装cockpit管理工具
63 4
Linux系统之Ubuntu安装cockpit管理工具
|
15天前
|
安全 Linux
Linux系统之lsof命令的基本使用
【10月更文挑战第14天】Linux系统之lsof命令的基本使用
71 2
Linux系统之lsof命令的基本使用
|
9天前
|
监控 网络协议 Shell
ip和ip网段攻击拦截系统-绿叶结界防火墙系统shell脚本
这是一个名为“小绿叶技术博客扫段攻击拦截系统”的Bash脚本,用于监控和拦截TCP攻击。通过抓取网络数据包监控可疑IP,并利用iptables和firewalld防火墙规则对这些IP进行拦截。同时,该系统能够查询数据库中的白名单,确保合法IP不受影响。此外,它还具备日志记录功能,以便于后续分析和审计。
34 6