users 命令详解与参数实测(Ubuntu 22.04)
users 命令逐参数实测详解:默认读取 /var/run/utmp 的单行输出规则、重复用户名与多会话一一对应、与 who/who -q/w/last 的选型对比、FILE 参数切换 wtmp 历史流水、不存在文件静默空输出的脚本双刃剑、输出同名归并不等于时间顺序、utmp 记录类型与 DEAD_PROCESS 生命周期,全部回显在 Ubuntu 22.04 实测通过。
users 命令详解与参数实测(Ubuntu 22.04)
目标:全面掌握 users 命令——默认读取
/var/run/utmp的输出规则、重复用户名与多会话的对应关系、与 who/who -q/w/last 的选型差异、FILE 操作数切换 wtmp 历史流水与不存在文件的静默空输出、会话注销后 utmp 记录的 DEAD_PROCESS 归宿,全部命令与回显已在 Ubuntu 22.04(GNU coreutils 8.32)实测通过。
一、环境信息
本节记录实测环境与数据来源,便于读者对照复现。users 是 GNU coreutils 里最精简的「谁在线」查询工具:只输出一行用空格分隔的用户名,没有表头、没有终端号、没有时间。它默认读取 /var/run/utmp(当前在线会话表),也可以指定 /var/log/wtmp(历史登录流水)来看「谁登录过」。为了让 users 有真实数据可查,本机安装并启动了 sshd,创建普通用户后通过 SSH 真实登录、自然退出,utmp 与 wtmp 中留下真实的会话记录——登录与登出两个方向的事件都真实发生过,后文 3.5 的空输出与空壳记录才有说服力。
- 操作系统:Ubuntu 22.04.5 LTS(x86_64)
- users 版本:GNU coreutils 8.32(软件包 coreutils 8.32-4.1ubuntu1.4,见 2.3 实测)
- 系统时区:UTC(回显中的时间均为 UTC)
- 远程接入:openssh-server(sshd 监听 22 端口),sshpass 自动化登录
- 数据文件:
/run/utmp(当前在线,root:utmp 664)、/var/log/wtmp(历史流水,root:utmp 664);btmp 与 lastlog 的记录格式与 users 无关 - 测试用户:
u4b1(uid=1002)、u4b2(uid=1003),通过 SSH 真实登录产生会话 - 演示目录:
/root/demo/users/(存放 utmp 快照副本,供姊妹篇对照使用)
四个登录记录文件的实测磁盘状态(users 关心其中前两个):
$ ls -l /var/log/wtmp /var/log/btmp /var/log/lastlog /run/utmp
-rw-rw-r-- 1 root utmp 1920 Oct 15 09:04 /run/utmp
-rw-rw---- 1 root utmp 1920 Oct 15 09:01 /var/log/btmp
-rw-rw-r-- 1 root utmp 584000 Oct 15 09:04 /var/log/lastlog
-rw-rw-r-- 1 root utmp 6912 Oct 15 08:59 /var/log/wtmp
权限细节值得注意:utmp 与 wtmp 都是 root:utmp 属主、664 权限——写入它们的是登录程序链路(sshd、login 等,通常借 utmp 组身份),普通用户只能读。这个设计保证了任意普通进程都伪造不了在线名单;users/who/w 这类查询工具因此可以放心地把 utmp 当作可信的实时状态。
测试账号的身份信息:
$ id u4b1; id u4b2
uid=1002(u4b1) gid=1004(u4b1) groups=1004(u4b1)
uid=1003(u4b2) gid=1005(u4b2) groups=1005(u4b2)
💡 技术拓展:登录记录「四件套」横向对比——
文件 记录内容 写入时机 对应查看命令 /run/utmp 当前在线会话 登录写入,登出改写为 DEAD_PROCESS 空壳 who、users、w /var/log/wtmp 历史登录/登出流水(追加式) 会话开始/结束时各追加一条 last /var/log/btmp 失败的登录尝试 认证失败时追加 lastb /var/log/lastlog 每个用户最近一次成功登录 成功登录时按 UID 定位覆盖写 lastlog users 的数据源只落在前两行:不加参数读 utmp 看实时在线,给 FILE 参数读 wtmp 看历史流水(帮助原文也点名了这个用法,见 2.2)。失败登录用 lastb、最近一次登录用 lastlog,users 一概不管。
二、命令概览
2.1 语法与测试数据
users 的语法为:
users [OPTION]... [FILE]
唯一的位置参数是 FILE(要读取的记录文件)。选项只有 --help 和 --version 两个「元选项」,没有任何行为选项——所有实用差异都来自「读哪个文件」。
users 出身于 BSD 系工具,后被 GNU coreutils 收编,可以理解为 who 的「极简版」:who 输出的用户名+终端+时间+来源多列信息,users 只保留第一列。别小看这份精简——单行、无表头、空格分隔的输出对 shell 脚本最友好,放进 for 循环或命令替换里无需任何列处理就能展开。
测试数据的时间线(便于对照各处回显):
- 08:46~08:53 第一轮 SSH 登录,u4b1、u4b2 共 5 次会话,全部已退出;
- 08:57 第二轮 SSH 登录,u4b1 两个会话(pts/6、pts/7)、u4b2 一个会话(pts/8)——
users主实测在这 3 个会话在线期间进行,此时 wtmp 已累计 5 + 3 = 8 条会话流水; - 08:59 长用户名 u4b-01longuser 一次短登录(专用于姊妹篇《last 命令详解与参数实测(Ubuntu 22.04)》的
-w参数演示); - 随后各会话陆续退出、utmp 清空——空输出实测在最后进行。
补充一个终端编号细节:SSH 每建立一个会话就分配一个 pts/N 伪终端,编号递增或复用已释放的编号。第二轮的三个会话分别落在 pts/6、pts/7、pts/8,因此 users 输出的三个名字按会话建立顺序排列;这也解释了为什么同一个用户名会重复出现——一个会话一个名字,与终端一一对应。
2.2 --help 全量输出
以下为 users --help 的完整回显,逐行照抄(空行保留):
$ users --help
Usage: users [OPTION]... [FILE]
Output who is currently logged in according to FILE.
If FILE is not specified, use /var/run/utmp. /var/log/wtmp as FILE is common.
--help display this help and exit
--version output version information and exit
GNU coreutils online help: <https://www.gnu.org/software/coreutils/>
Report any translation bugs to <https://translationproject.org/team/>
Full documentation <https://www.gnu.org/software/coreutils/users>
or available locally via: info '(coreutils) users invocation'
帮助正文只有两句话,却把核心都说清了:输出「according to FILE」的当前登录名单;FILE 缺省是 /var/run/utmp,而把 /var/log/wtmp 当 FILE 传入是常见用法(历史会话名单,实测见 3.2)。选项列表里确实只有 --help/--version。帮助末行还指明了本地文档入口 info '(coreutils) users invocation'——GNU 系工具的文档体系里,info 才是全量手册,man 页只是摘要。
2.3 版本信息
$ users --version
users (GNU coreutils) 8.32
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by Joseph Arceneaux and David MacKenzie.
再核对二进制归属与软件包版本:
$ dpkg -S $(which users) 2>&1
coreutils: /usr/bin/users
$ dpkg -l login util-linux coreutils 2>/dev/null | grep -E '^ii'
ii coreutils 8.32-4.1ubuntu1.4 amd64 GNU core utilities
ii login 1:4.8.1-2ubuntu2.2 amd64 system login tools
ii util-linux 2.37.2-4ubuntu3.6 amd64 miscellaneous system utilities
关键信息:Ubuntu 22.04 的 users 属于 GNU coreutils 8.32——与 last/su(util-linux)、lastlog(login 包,shadow)都不同源。coreutils 系命令的 --help/--version 输出格式高度统一(版权声明、作者行、在线帮助链接),排障时可以直接套用这套模板找文档。
三、参数逐项实测
3.1 无参数:默认读取 /var/run/utmp
三个 SSH 会话在线期间(u4b1 两个、u4b2 一个),不带参数执行 users:
$ users
u4b1 u4b1 u4b2
输出的三条规则:一行、空格分隔、无表头;同一个用户名出现两次,代表 u4b1 有两个并发会话。与多行明细风格的 who 对照着看:
$ who
u4b1 pts/6 Oct 15 08:57 (::1)
u4b1 pts/7 Oct 15 08:57 (::1)
u4b2 pts/8 Oct 15 08:57 (::1)
who 的 3 行会话与 users 的 3 个名字一一对应(顺序也一致,都是 utmp 里的记录顺序:pts/6 → pts/7 → pts/8)。把输出里的每个名字与 who 的会话逐一对上:
| users 输出位置 | 用户名 | 对应会话(who 对照) |
|---|---|---|
| 第 1 个 | u4b1 | pts/6 |
| 第 2 个 | u4b1 | pts/7 |
| 第 3 个 | u4b2 | pts/8 |
再与 who -q(快速计数模式)对照:
$ who -q
u4b1 u4b1 u4b2
# users=3
who -q 的第一行与 users 的输出完全相同,只是额外多了一行 # users=3 的总数统计。
💡 要点:users 刻意不做表格——单行、空格分隔的设计让它能直接塞进 shell 的 for 循环与命令替换,不需要 awk/cut 做列处理。这是它与 who 分工的根本原因:who 给人看,users 给脚本用。
💡 技术拓展:who 系工具选型对比——
命令 输出粒度 数据源 适用场景 users 只有用户名(一行,空格分隔) utmp(或 FILE) 脚本里一行拿到在线名单 who 用户名+终端+时间+来源(多行) utmp 看会话明细、定位终端 who -q 用户名一行 + # users=总数utmp 只要人数与名单 w 用户名+终端+来源+登录时间+空闲+当前命令 utmp + 进程表 看用户正在干什么 last / lastb 历史/失败登录流水(多行) wtmp / btmp 事后审计 一句话总结:users 是「只要名字」的极简入口,明细找 who,深挖找 w,历史找 last。
3.2 FILE=/var/log/wtmp:从实时快照切到历史流水
把 FILE 指定为 wtmp,users 改为输出文件里的全部会话记录(不只是当前在线的):
$ users /var/log/wtmp
u4b1 u4b1 u4b1 u4b1 u4b1 u4b2 u4b2 u4b2
8 个名字对应 wtmp 中当时的 8 条会话流水。逐条拆开与姊妹篇《last 命令详解与参数实测(Ubuntu 22.04)》的流水对照:
| 轮次 | 会话(用户@终端) | 抓取 users /var/log/wtmp 时的状态 |
|---|---|---|
| 第一轮 08:46 | u4b1@pts/4、u4b2@pts/4、u4b1@pts/4 | 已退出 |
| 第一轮 08:51 | u4b1@pts/6、u4b2@pts/5 | 已退出 |
| 第二轮 08:57 | u4b1@pts/6、u4b1@pts/7、u4b2@pts/8 | 仍在线 |
u4b1 合计 5 次、u4b2 合计 3 次,正好对上输出的 5 + 3。对比 3.1 的 3 个名字,多出来的 5 个正是第一轮「已结束」的会话——wtmp 是追加式日志,已退出的会话记录不会被删掉。
💡 要点:wtmp 视角的 users 适合回答「发生过什么」,last 适合回答「每一条的细节」——前者给出压缩成名字的总量,后者给出带时间与时长的流水。要快速感知规模用 users /var/log/wtmp,要精确取证用 last(姊妹篇有完整的
-f离线分析与时间窗过滤实测)。
💡 技术拓展:utmp 与 wtmp 共用同一套记录结构,差别只在写入策略——这正是 users 传个 FILE 就能在两种视角间切换的原因:
对比项 /run/utmp /var/log/wtmp 写入方式 改写:登录时写入会话记录,登出时原地改写为 DEAD_PROCESS 空壳 追加:会话开始、结束时各追加一条新记录 文件大小 基本恒定(随会话数小幅波动,本机实测 1920 字节) 只增不减,长期运行需轮转 时效性 只反映「当前」 完整历史 典型消费者 who、users、w last 等审计工具 同一份数据、两种生命周期:utmp 是「白板」,wtmp 是「流水账」。
3.3 FILE=/run/utmp:显式指定等价默认
把默认文件显式写出来,输出应与 3.1 完全一致——实测确实一致:
$ users /run/utmp
u4b1 u4b1 u4b2
💡 要点:这个实验证明了 FILE 参数是替换默认数据源,而不是叠加或过滤。同一时刻
users与users /run/utmp永远等价;变化的只会是「读哪个文件」,不会是解析逻辑。另外/var/run在现代发行版上是/run的符号链接,帮助原文写的是历史叫法/var/run/utmp,两个路径指向同一个文件,实测均正常读取。
3.4 FILE=不存在的文件:静默空输出
给一个不存在的文件名,users 的表现非常「安静」——没有输出,也没有任何错误提示:
$ users nosuchfile
命令直接返回,屏幕上什么都没有。这对脚本是把双刃剑:判断「无人在线」的场景下空输出正合适;但如果路径写错,也会得到同样的空输出,错误被静默吞掉。关键脚本应先校验文件存在(如 test -f)再把路径交给 users。两步走的示意流程:
if [ -f /run/utmp ] && [ -n "$(users)" ]; then
echo "有用户在线,暂缓维护操作"
fi
-n "$(users)" 在无人在线(空输出)时为假;文件缺失时第一个条件已经拦下——「文件丢了」和「没人在线」这两类空就被区分开了。
3.5 会话全部结束后:空输出与 DEAD_PROCESS 空壳
所有 SSH 会话退出后再次执行 users,输出为空:
$ users
用户明明登录过,为什么「查无此人」?看 utmp 里留下的痕迹——who -a 显示全部记录类型,注销后的会话条目变成了没有用户名的空壳行:
$ who -a
pts/4 Oct 15 09:04 9253 id=ts/4 term=0 exit=0
pts/5 Oct 15 08:53 7390 id=ts/5 term=0 exit=0
pts/6 Oct 15 08:57 8366 id=ts/6 term=0 exit=0
pts/7 Oct 15 08:57 8364 id=ts/7 term=0 exit=0
pts/8 Oct 15 08:57 8365 id=ts/8 term=0 exit=0
💡 技术拓展:utmp 记录的「生命周期」——登录时写入一条 USER_PROCESS 记录(users/who 只显示这类);登出时同一条记录被改写为 DEAD_PROCESS(进程 ID、终端号还在,用户名清空),who -a 会把它们显示为无用户名的空壳行。所以「注销」不会在 utmp 里留下一行「xxx 已退出」,而是把原来的那行抹掉用户名;完整的历史轨迹要去 wtmp(last)里找。
💡 技术拓展:utmp 里的记录不止「在线会话」一种,
who -a看到的空壳行只是其中之一。常见记录类型(见 utmp(5)):
类型 含义 users 是否显示 USER_PROCESS 交互登录会话(用户已登录) 显示 DEAD_PROCESS 已结束的会话空壳 不显示 LOGIN_PROCESS 登录服务进程(如 getty)占位 不显示 INIT_PROCESS 由 init 派生的进程记录 不显示 BOOT_TIME / RUN_LVL 开机时刻 / 运行级切换 不显示 EMPTY 空槽位 不显示 所以「users 输出为空」的准确含义是「当前没有 USER_PROCESS 状态的记录」,而不是「utmp 文件是空的」——本机实测里 utmp 明明还躺着 5 条空壳记录(who -a 可见)。
3.6 输出顺序:同名归并,不等于时间顺序
把 3.2 的输出与 wtmp 的真实时间线放在一起,有一个反直觉发现。wtmp 中那 8 条会话的真实先后是两用户交错的(08:46 u4b1→u4b2→u4b1,08:51 u4b1→u4b2,08:57 u4b1→u4b1→u4b2,完整流水见姊妹篇《last 命令详解与参数实测(Ubuntu 22.04)》),而 users 的输出却是:
$ users /var/log/wtmp
u4b1 u4b1 u4b1 u4b1 u4b1 u4b2 u4b2 u4b2
u4b1 的 5 条全部在前、u4b2 的 3 条全部在后——同名记录被归并到一起,不是登录时间顺序,也与文件里记录的物理先后不同。结论:users 的输出顺序没有任何「时间线」语义可依赖,依赖顺序的脚本必须自行排序;要还原真实的会话时间线,用 last(按时间从新到旧输出)。
四、实战示例
4.1 场景一:一行速查在线用户与人数
巡检或欢迎横幅类场景里,一行拿到在线名单:
$ users
u4b1 u4b1 u4b2
需要人数时不必写复杂的计数逻辑,who -q 直接给出名单加总数:
$ who -q
u4b1 u4b1 u4b2
# users=3
注意 # users=3 统计的是会话数而非用户数(u4b1 一个人占了两个会话)——要算「几个人」,需要对用户名去重。把这个动作放进巡检脚本时注意时点:users 反映的是执行瞬间的 utmp 快照,夜间无人时段跑会得到空名单,属正常现象;把「空名单」配置成异常告警前,先核对巡检时段是否本来就是无人窗口。
4.2 场景二:utmp 与 wtmp 对照,判断会话状态
同一个时间点上对比两个文件:
$ users
u4b1 u4b1 u4b2
$ users /var/log/wtmp
u4b1 u4b1 u4b1 u4b1 u4b1 u4b2 u4b2 u4b2
utmp 里 3 个名字、wtmp 里 8 个名字,差值 5 就是「已经结束的会话数」。服务器出现可疑连接时,这个差值能快速回答「历史上一共建立过多少次会话、现在还挂着几个」;再往深挖就交给 last 看每条会话的起止时间(见姊妹篇《last 命令详解与参数实测(Ubuntu 22.04)》)。
两份名单的差值还能反向验证注销流程是否健康:若 wtmp 的会话数明显大于「utmp 在线数 + 已确认的正常退出数」,就要怀疑有会话被异常终止(登出事件没写全)。另外 wtmp 长期只增不减,生产环境应交给 logrotate 轮转;轮转出的历史归档文件同样可以作为 FILE 传给 users 翻查(机制与 3.2 一致)。
4.3 场景三:无人值守脚本的空值判断
users 的空输出天然适合做「是否有人在线」的闸门判断:维护脚本执行破坏性操作前先跑一次 users,输出为空才放行。典型适用动作包括卸载文件系统、重启服务、切换运行级、批量 kill 进程——这些操作都希望独占系统、不误伤在线会话。结合 3.4 的实测结论(文件不存在也静默为空),严谨的写法是先用 test -f /run/utmp 校验文件存在,再把 users 的输出交给空值判断,避免「文件丢失」被误判成「无人在线」。
4.4 场景四:与 who 组合定位同名多会话
users 看到 u4b1 出现两次,但不知道是哪两个终端——升一级用 who 看明细:
$ who
u4b1 pts/6 Oct 15 08:57 (::1)
u4b1 pts/7 Oct 15 08:57 (::1)
u4b2 pts/8 Oct 15 08:57 (::1)
同名重复的归属一目了然(pts/6 与 pts/7)。定位到具体终端后,管理员可以针对性处理:向该终端上的会话进程发信号、用 write 向该终端发消息、或在必要时强制结束该会话——这些动作都需要 pts 终端号,而 users 恰恰不提供,必须升一级用 who。要继续追问「这两个会话是什么时候建立的、每次连了多久」,再往下用 last 按用户名过滤轨迹即可——三层工具由粗到细各司其职:users 给名字、who 给终端、last 给时间线。
4.5 场景五:由粗到细的会话排查三连
把本组工具串成一套固定的排查动作,应急时按顺序执行:先用 users 一行看「有没有人、几个人名」;发现同名重复或陌生名字后,用 who 展开成终端明细(3.1 实测的 pts/6、pts/7、pts/8);最后对可疑用户名跑 last 拉完整轨迹(见姊妹篇 4.1 场景的实测输出)。三层各答一个问题——users 答「谁在」,who 答「从哪个终端连进来的」,last 答「他历史上还连过几次、每次多久、从哪里连的」。熟练之后,这套三连一两分钟就能给出初步结论,剩下的才是深入取证。
五、注意事项与常见问题
Q1:同一个用户名为什么出现多次?
users 按 utmp 中的会话记录输出,一个名字对应一个会话:同名重复 N 次就是该用户有 N 个并发会话(3.1 实测 u4b1 两个会话出现两次)。它不做去重,所以 users 的输出长度等于会话数,不等于用户数。
Q2:users 与 who -q 有什么区别?
名单部分完全相同(3.1 实测两者第一行逐字一致),区别只在 who -q 末尾多一行 # users=3 总数。脚本里要总数就用 who -q,只要名单就用 users——两者都读 utmp,没有信息差。
Q3:用户注销后,users 为什么就查不到他了?
登出时 utmp 中该会话记录被改写为 DEAD_PROCESS 空壳(用户名字段被清空),users/who 只显示 USER_PROCESS 状态的记录,于是「人消失了」。空壳记录仍然存在,who -a 可以看到(3.5 实测);完整轨迹在 wtmp 里,用 last 查。
Q4:为什么文件不存在也不报错? 实测 users 对打不开的 FILE 静默输出空(3.4),不打印任何诊断信息。这是双刃剑:好处是脚本可以放心拿空输出当「无人在线」;风险是路径写错无人知晓。关键自动化场景务必先校验文件存在。
Q5:把 wtmp 当 FILE 传入,输出会不会非常长?
会。wtmp 是追加式日志,长期运行的服务器上会积累成千上万条会话记录,users 会把每条会话都吐成一个名字。本例 8 条还能一眼数清,生产环境应配合统计手段处理,或改用 last 带时间过滤精确定位(见姊妹篇的 -s/-t 参数实测)。顺带一提,wtmp 应交给 logrotate 轮转;轮转出的归档文件同样可以作为 FILE 传入继续翻查历史(机制同 3.2)。
Q6:users 能读 btmp 或 lastlog 吗? 不能。users 只解析 utmp/wtmp 这一套记录格式;btmp 的失败登录记录用 lastb 查,lastlog 的「每用户最近一次登录」用 lastlog 查(均有姊妹篇详解)。记录结构不同,工具不可互换。
Q7:users 显示的名单和实际连接数对不上怎么办?
utmp 只记录交互式登录会话。本组实测确认过:以 ssh host 'command' 方式执行单条远程命令(不分配伪终端)不产生登录记录;另外部分服务自身的长连接(数据库、消息队列等)也不进 utmp。users 看到的是「交互登录会话」,不是「TCP 连接数」。
Q8:users 的输出需要去重吗?
看目的:判断「有没有人在线」直接看非空即可;统计「几个人在线」需要去重(同名重复是多会话);统计「几个会话在线」直接数名字个数,或用 who -q 的总数行。
Q9:users 的输出是按字母序排的吗? 呈现上本组实测恰好符合字母序(u4b1 在 u4b2 前),但 3.6 的 wtmp 视角证明它不是时间序——真实时间线两用户交错,输出却同名归并。users 没有承诺任何排序规则,依赖顺序的脚本请自行 sort。
Q10:users 与 uptime 末尾的「N users」是同一套数据吗? 同源。uptime 的用户计数同样读取 utmp 的 USER_PROCESS 记录,所以两边统计的都是「会话」而不是「人」;utmp 记录被异常残留时(会话被强杀、登出事件丢失),两边会一起虚高。拿不准时用 who -a 看原始记录,再对照 last 输出里的 still logged in 状态(姊妹篇第五节 Q5 有专门分析)。
Q11:users 会不会把系统会话也算进去? 不会。users 只挑 USER_PROCESS 类型的记录(类型清单见 3.5 的拓展表):getty 等登录服务的占位记录(LOGIN_PROCESS)、init 派生进程记录(INIT_PROCESS)都不进名单。本机实测里 who -a 只看到会话空壳、users 输出为空,两者行为自洽。
Q12:users 有没有选项能改输出格式?
没有。选项只有 --help/--version 两个元选项(2.2),输出格式写死为一行空格分隔。要终端号、时间、来源换 who;要空闲时长与正在执行的命令换 w;要历史轨迹换 last——users 的定位就是「极简名单」,格式扩展不是它的职责。
Q13:users 的输出能直接喂给 for 循环吗? 这正是它单行空格分隔设计的价值所在。示意用法:
for u in $(users); do
echo "在线会话:$u"
done
不需要 awk/cut 做任何列切分,命令替换展开后天然就是逐词遍历。注意遍历的是会话而非用户(同名会重复出现),按用户去重需要自行处理。
Q14:users 在不同发行版上行为一致吗? users 的行为由实现决定:GNU coreutils 系发行版(Ubuntu、Debian、Fedora、RHEL 等)输出格式与参数一致;BusyBox 也自带精简版 users,输出同为单行名单但选项集合可能更小。跨发行版脚本中不要依赖 --help 之外的行为差异,本篇全部实测结论仅对 GNU coreutils 8.32 成立。
六、参考链接
- users 调用说明(GNU coreutils 手册):https://www.gnu.org/software/coreutils/manual/html_node/users-invocation.html
- users(1) 手册页(Ubuntu 22.04 jammy):https://manpages.ubuntu.com/manpages/jammy/en/man1/users.1.html
- who(1) 手册页(Ubuntu 22.04 jammy):https://manpages.ubuntu.com/manpages/jammy/en/man1/who.1.html
- utmp/wtmp/btmp 记录格式(utmp(5)):https://man7.org/linux/man-pages/man5/utmp.5.html
- GNU coreutils 官方手册总目录:https://www.gnu.org/software/coreutils/manual/
- GNU coreutils 上游源码仓库:https://github.com/coreutils/coreutils
- 姊妹篇:《last 命令详解与参数实测(Ubuntu 22.04)》《lastlog 命令详解与参数实测(Ubuntu 22.04)》《su 命令详解与参数实测(Ubuntu 22.04)》