ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

SerenityOS `w` 命令完全指南:查看当前登录用户与终端活动状态

SerenityOS `w` 命令完全指南:查看当前登录用户与终端活动状态 SerenityOSw命令完全指南查看当前登录用户与终端活动状态【免费下载链接】serenityThe Serenity Operating System 项目地址: https://gitcode.com/GitHub_Trending/se/serenity导读w是 SerenityOS 系统中用于查看当前已登录用户及其终端活动状态的系统工具其作用与类 Unix 系统中的同名命令一致。本文以 Base/usr/share/man/man1/w.md 手册页为骨架结合其实现源码 Userland/Utilities/w.cpp、登录会话记录工具utmpupdate以及终端应用 Userland/Applications/Terminal/main.cpp 的调用链带你完整掌握w的用法、输出字段含义、底层数据来源/var/run/utmp与/sys/kernel/processes以及它与其他用户管理命令whoami、usermod、utmpupdate之间的关系。读完本文你将能够熟练使用w排查多用户登录状态、定位空闲会话并理解 SerenityOS 中登录会话记录机制的完整数据流。命令概览w命令显示关于当前登录用户的信息包括每个登录会话对应的终端TTY、登录时间、空闲时长以及当前正在前台运行的命令。其基本形态如下$ w [--no-header] [user]user可选位置参数。指定后w只显示该指定用户的登录会话信息。-h,--no-header可选开关。指定后不显示表头行USER TTY LOGIN IDLE WHAT。关于命令的完整选项与参数说明可以直接查阅仓库内手册 Base/usr/share/man/man1/w.md。参数解析的实现w使用 SerenityOS 自带的Core::ArgsParser完成参数解析对应源码位于 Userland/Utilities/w.cppbool hide_header false; StringView username_to_filter_by; Core::ArgsParser args_parser; args_parser.add_option(hide_header, Dont show the header, no-header, h); args_parser.add_positional_argument(username_to_filter_by, Only show information about the specified user, user, Core::ArgsParser::Required::No); args_parser.parse(args);可以看到-h/--no-header与hide_header布尔变量绑定决定是否输出表头user是可选位置参数Required::No与username_to_filter_by绑定用于按用户名过滤输出。输出格式详解w默认输出一个表头加若干数据行每个登录会话一行。表头与数据行的格式由源码中的两处格式化字符串决定Userland/Utilities/w.cpp 与 Userland/Utilities/w.cppUSER TTY LOGIN IDLE WHAT列名含义生成方式源码依据USER登录用户名由会话记录中的uid通过/etc/passwd反查得到若反查失败则直接显示数字 UIDTTY伪终端名根据 TTY 设备的主设备号映射为pts:N或tty:NLOGIN登录时刻由会话记录中的login_at时间戳按%b%d %H:%M:%S格式化如Sep09 04:11:23IDLE空闲时长当前时间减去 TTY 设备文件的st_mtime最后一次活动时间以秒为单位显示WHAT当前前台命令在该 TTY 上运行的、PID 等于其进程组 ID 的进程名无法获取时显示n/a一个典型的输出形如USER TTY LOGIN IDLE WHAT anon pts:0 Sep09 04:05:33 12s Shell root tty:1 Sep09 03:58:01 600s n/aTTY 名称的映射逻辑源码中的tty_stat_to_pseudo_name函数Userland/Utilities/w.cpp根据 TTY 设备的主设备号把设备路径转换为人类可读的名称主设备号201→pts:{minor}伪终端即终端模拟器使用的会话主设备号4→tty:{minor}物理/系统控制台终端其他类型返回Unknown TTY device type错误。空闲时长IDLE的计算原理w通过stat获取 TTY 设备文件的st_mtime最后修改时间作为最后一次终端活动时间再用当前 Unix 时间戳减去它得到空闲秒数Userland/Utilities/w.cppauto maybe_stat Core::System::stat(tty); if (!maybe_stat.is_error()) { auto stat maybe_stat.release_value(); auto idle_time now - stat.st_mtime; if (idle_time 0) { builder.appendff({}s, idle_time); idle_string TRY(builder.to_string()); } }如果无法对 TTY 执行stat例如会话记录中的 TTY 已不存在则IDLE与WHAT均显示为n/a。当前前台命令WHAT的推断WHAT列通过进程统计信息反查遍历 Userland/Libraries/LibCore/ProcessStatisticsReader.h 提供的ProcessStatistics列表找到tty与当前 TTY 匹配、且pid pgid进程 ID 等于进程组 ID即该进程组的组长的进程取其name作为前台命令Userland/Utilities/w.cpp。这一进程组组长即前台进程的推断方式与常规 Unix 会话模型一致。按用户过滤当传入user位置参数时w只输出该用户的会话行。源码中通过用户名精确字符串比较实现过滤Userland/Utilities/w.cppif (!username_to_filter_by.is_empty() username_to_filter_by ! username) return {};例如$ w anon只显示用户anon的所有登录会话不指定参数则显示所有用户。底层数据来源/var/run/utmp与/sys/kernel/processesw的输出并非凭空生成而是来自两个数据源/var/run/utmp登录会话记录的 JSON 文件。w打开并读取该文件Userland/Utilities/w.cpp文件内容是一个 JSON 对象以 TTY 名为键每个会话包含uid、pid、from、login_at等字段。若解析失败非 JSON 对象w会向标准错误输出Error: Could not parse /var/run/utmp并返回退出码 1。/sys/kernel/processes内核导出的进程统计信息。w通过Core::ProcessStatisticsReader::get_all()Userland/Utilities/w.cpp读取用于推断各 TTY 上前台运行的命令WHAT列。安全加固pledge 与 unveilw在启动时调用了 SerenityOS 的沙箱原语pledge与unveilUserland/Utilities/w.cpp声明自己只需要标准 I/O 读路径权限并只允许读取以下文件/目录/devTTY 设备用于stat计算空闲时长/etc/group、/etc/passwd用户与组信息反查/etc/timezone时间相关/var/run/utmp登录会话记录/sys/kernel/processes进程统计这是一种典型的最小权限设计即使w被攻破也无法写入任何文件或访问未声明的资源。登录会话从何而来utmpupdate与终端模拟器的配合w读取的/var/run/utmp由另一个命令维护utmpupdate。其用法为$ utmpupdate [--create] [--delete] [--PID PID] [--from From] tty选项说明-c,--create为指定 TTY 创建登录会话记录-d,--delete删除指定 TTY 的登录会话记录-p PID,--PID PID记录会话对应的进程 PID-f From,--from From记录会话来源如Terminaltty位置参数TTY 名称utmpupdate的实现位于 Userland/Utilities/utmpupdate.cpp--create时会以当前调用者 UID、给定 PID 与当前时间构造一条记录写入 JSON--delete时按 TTY 名移除记录。-c与-d互斥同时指定会报错并返回 1。Terminal 应用的调用链SerenityOS 自带的终端模拟器 Terminal 在创建/关闭伪终端会话时会以子进程方式调用utmpupdate来登记或注销会话Userland/Applications/Terminal/main.cppArray utmp_update_command { -fsv, Terminalsv, -psv, pid_string.bytes_as_string_view(), (create ? -csv : -dsv), tty, }; auto utmpupdate_pid TRY(Core::Process::spawn(/bin/utmpupdatesv, utmp_update_command, {}, Core::Process::KeepAsChild::Yes));这正是w中LOGIN、TTY等字段得以填充的源头。同时utmpupdate自身也通过pledge(stdio wpath cpath)与unveil(/var/run/utmp, rwc)将权限限制在读写/var/run/utmpUserland/Utilities/utmpupdate.cpp。构建与集成位置w属于 SerenityOS 用户态核心命令集被列入REQUIRED_TARGETS构建系统强制要求的目标源码条目位于 Userland/Utilities/CMakeLists.txt并在 Userland/Utilities/CMakeLists.txt 的必需命令列表中。这意味着在任何完整构建的 SerenityOS 镜像中/bin/w都会随系统一起编译安装。常见用法示例# 查看所有登录用户及其终端活动 $ w # 不显示表头便于脚本解析 $ w --no-header # 只查看指定用户如 anon的会话 $ w anon # 组合使用只看 anon 且不要表头 $ w -h anon-h与位置参数可以任意组合顺序不影响解析结果因为参数均由Core::ArgsParser统一处理。相关命令w通常与以下命令配合使用形成一个完整的用户与会话管理工具链whoami(1)打印当前有效 UID 对应的用户名。示例whoami输出anon# whoamiroot输出root。它回答的是我是谁而w回答的是现在都有谁登录着、在干什么。utmpupdate(1)维护/var/run/utmp登录会话记录是w数据的上游写入者其手册页也反向链接回w。usermod(8)管理系统用户账户如修改用户所属组、Shell 等与查看会话状态的w互补。小结w虽然是一个小命令但它的实现串起了 SerenityOS 中多条关键机制JSON 格式的系统状态文件/var/run/utmp、内核进程统计接口/sys/kernel/processes、pledge/unveil最小权限模型以及终端模拟器与会话登记工具之间的进程协作。理解w的完整数据流也就理解了 SerenityOS 多用户会话管理的核心脉络。【免费下载链接】serenityThe Serenity Operating System 项目地址: https://gitcode.com/GitHub_Trending/se/serenity创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表