【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编程专家。我期待看到你在这个旅途中取得更大进步!

目录
相关文章
|
3天前
|
IDE Linux 开发工具
Linux 系统上安装
在Linux和Mac上安装Lua 5.3.0只需下载源码,解压,编译和安装。Windows用户可选择SciTE IDE或通过LuaForWindows在Github或Google Code下载安装。创建 HelloWorld.lua,使用`lua HelloWorld.lua`运行显示&quot;Hello World!&quot;。另可参考LuaDist官方推荐方式安装。
|
3天前
|
Ubuntu Linux 编译器
【Linux】详解动静态库的制作和使用&&动静态库在系统中的配置步骤
【Linux】详解动静态库的制作和使用&&动静态库在系统中的配置步骤
|
3天前
|
Linux Windows
虚拟机添加新硬盘之linux系统篇
虚拟机添加新硬盘之linux系统篇
15 1
|
1天前
|
运维 Linux
CentOS系统openssh-9,你会的还只有初级Linux运维工程师的技术吗
CentOS系统openssh-9,你会的还只有初级Linux运维工程师的技术吗
|
2天前
|
监控 JavaScript Linux
Linux系统之部署Homepage个人导航页
【5月更文挑战第13天】Linux系统之部署Homepage个人导航页
21 1
|
3天前
|
监控 JavaScript 网络协议
Linux系统之安装uptime-kuma服务器监控面板
【5月更文挑战第12天】Linux系统之安装uptime-kuma服务器监控面板
14 0
|
3天前
|
Shell Linux Perl
Linux|如何允许 awk 使用 Shell 变量
Linux|如何允许 awk 使用 Shell 变量
13 2
|
3天前
|
Linux Perl
Linux系统的文本处理
Linux系统的文本处理
|
3天前
|
Linux API
Linux系统编程之文件编程常用API回顾和文件编程一般步骤
Linux系统编程之文件编程常用API回顾和文件编程一般步骤
Linux系统编程之文件编程常用API回顾和文件编程一般步骤
|
3天前
|
编解码 Ubuntu Linux