lastlog 命令详解与参数实测(Ubuntu 22.04)
lastlog 命令逐参数实测详解:全表输出与 Never logged in 的真实语义、-u 用户名与 UID 区间查询及重复覆盖陷阱、-t/-b 时间窗过滤、-S/-C 记录置位清除与伪造风险、-R 跨根目录读取、无 --version 与 -f 时的版本确认与快照替代方案、584000 字节稀疏文件仅占 52K 磁盘的原理,全部回显在 Ubuntu 22.04 实测通过。
lastlog 命令详解与参数实测(Ubuntu 22.04)
目标:全面掌握 lastlog 的每一个参数——全表输出与字段解读、
-u用户名/UID 区间查询与重复参数覆盖陷阱、-t/-b时间窗过滤、-S/-C记录置位与清除、-R指定根目录读取,以及没有--version和-f时如何确认版本、如何处理快照文件,顺带讲透/var/log/lastlog的稀疏文件特性,全部命令与回显已在 Ubuntu 22.04(shadow 套件 login 1:4.8.1)实测通过。
一、环境信息
本节记录实测环境与数据来源,便于读者对照复现。lastlog 是 shadow 套件的「最近一次登录」查询工具:它读取 /var/log/lastlog,每个用户只保留一条最近一次成功登录的记录(按 UID 定位覆盖写),这与姊妹命令 last 逐条追加 wtmp 流水的思路完全不同。为了给 lastlog 准备真实数据,本机安装并启动了 sshd,创建普通用户后通过 SSH 真实登录,让登录链路自然写入记录。
- 操作系统:Ubuntu 22.04.5 LTS(x86_64)
- lastlog 版本:命令本身无
--version/-V(实测见 2.3),二进制归属 login 包(shadow 套件),包版本 login 1:4.8.1-2ubuntu2.2 - 系统时区:UTC(回显中的时间均为 UTC)
- 远程接入:openssh-server(sshd 监听 22 端口)
- 记录文件:
/var/log/lastlog(属主 root:utmp,权限 644;逻辑大小 584000 字节、磁盘实际只占 52K——稀疏文件,见 3.9) - 测试用户:
u4b1(uid=1002)、u4b2(uid=1003)通过 SSH 真实登录产生记录;u4b3专用于-S/-C写操作演示;系统自带账号保持从未登录状态
四个登录记录文件的实测磁盘状态:
$ 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
💡 技术拓展:登录记录「四件套」横向对比——
文件 记录内容 写入时机 对应查看命令 /run/utmp 当前在线会话 登录写入,登出改写为 DEAD_PROCESS 空壳 who、users、w /var/log/wtmp 历史登录/登出流水(追加式) 会话开始/结束时各追加一条 last /var/log/btmp 失败的登录尝试 认证失败时追加 lastb /var/log/lastlog 每个用户最近一次成功登录 成功登录时按 UID 定位覆盖写 lastlog lastlog 只读
/var/log/lastlog这一个文件——没有-f参数,是四件套查看命令里数据源最「死」的一个(实测见 3.8)。
二、命令概览
2.1 语法与测试数据
lastlog 的语法为:
lastlog [options]
典型的 shadow 风格:只收选项——不接受位置参数过滤,也没有文件参数,数据源固定为 /var/log/lastlog。
测试数据的时间线(便于对照文中各处回显的时间差):
- 08:46~08:53 第一轮 SSH 登录,u4b1、u4b2 各留下两次会话(wtmp 流水共 9 条,详见姊妹篇《last 命令详解与参数实测(Ubuntu 22.04)》);
- 约 08:55 抓取 lastlog 全表及
-u/-t/-b等回显——此时 u4b1/u4b2 的 lastlog 记录停留在 08:51 那次会话; - 08:57 第二轮 SSH 登录——发生在全表抓取之后,因此 3.7 的
-R回显里 u4b1 的记录已更新为 08:57:14,恰好演示了「每用户只保留最近一次」。
2.2 --help 全量输出
以下为 lastlog --help 的完整回显,逐行照抄(空行保留):
$ lastlog --help
Usage: lastlog [options]
Options:
-b, --before DAYS print only lastlog records older than DAYS
-C, --clear clear lastlog record of an user (usable only with -u)
-h, --help display this help message and exit
-R, --root CHROOT_DIR directory to chroot into
-S, --set set lastlog record to current time (usable only with -u)
-t, --time DAYS print only lastlog records more recent than DAYS
-u, --user LOGIN print lastlog record of the specified LOGIN
选项分三类:查询过滤(-u 用户/UID、-t 最近 N 天、-b 早于 N 天)、写操作(-S 置位、-C 清除,帮助原文标注 usable only with -u,只能与 -u 搭配)、数据源定位(-R chroot 根目录)。特别注意 -u 的参数虽然写作 LOGIN,实际还接受 UID 与 UID 区间(实测见 3.2)。
2.3 版本信息
lastlog 没有 --version 开关。实测传入会被当作未知选项拒绝,并把 Usage 完整打印一遍:
$ lastlog --version
lastlog: unrecognized option '--version'
Usage: lastlog [options]
Options:
-b, --before DAYS print only lastlog records older than DAYS
-C, --clear clear lastlog record of an user (usable only with -u)
-h, --help display this help message and exit
-R, --root CHROOT_DIR directory to chroot into
-S, --set set lastlog record to current time (usable only with -u)
-t, --time DAYS print only lastlog records more recent than DAYS
-u, --user LOGIN print lastlog record of the specified LOGIN
版本信息改走包管理证据链——先定位二进制归属,再查包版本:
$ dpkg -S $(which lastlog)
login: /usr/bin/lastlog
$ 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 的 lastlog 属于 login 包(shadow 套件)1:4.8.1-2ubuntu2.2——与 last/su(util-linux)、users(coreutils)不同源。shadow 套件的 lastlog 没有 -V 短选项,--version 被按未知选项处理;同门工具(chage、faillog 等)也多为此风格,拿不到版本时走 dpkg -S + dpkg -l 是通用解法。
三、参数逐项实测
3.1 无参数:全表输出与字段解读
不带任何参数执行 lastlog,输出 lastlog 文件中全部用户(含从未登录的)的最近登录状态。实测(抓取时点见 2.1 时间线第 2 步):
$ lastlog
Username Port From Latest
root **Never logged in**
daemon **Never logged in**
bin **Never logged in**
sys **Never logged in**
sync **Never logged in**
games **Never logged in**
man **Never logged in**
lp **Never logged in**
mail **Never logged in**
news **Never logged in**
uucp **Never logged in**
proxy **Never logged in**
www-data **Never logged in**
backup **Never logged in**
list **Never logged in**
irc **Never logged in**
gnats **Never logged in**
nobody **Never logged in**
_apt **Never logged in**
u4d1 **Never logged in**
u4d2 **Never logged in**
systemd-network **Never logged in**
systemd-resolve **Never logged in**
messagebus **Never logged in**
systemd-timesync **Never logged in**
sshd **Never logged in**
u4b1 pts/6 ::1 Thu Oct 15 08:51:45 +0000 2026
u4b2 pts/5 ::1 Thu Oct 15 08:51:45 +0000 2026
u4a-demo **Never logged in**
输出按 /etc/passwd 中的账号顺序排列(而非登录时间排序)。各列含义:
| 列 | 示例值 | 含义 |
|---|---|---|
| Username | u4b1 | 用户名 |
| Port | pts/6 | 最近一次登录的终端(pts/N 为伪终端);-S 手工置位的记录此处显示 lastlog(见 3.6) |
| From | ::1 | 登录来源(IPv6 回环地址,即本机连本机) |
| Latest | Thu Oct 15 08:51:45 +0000 2026 | 最近一次成功登录时刻,带时区偏移 |
| (无记录时) | Never logged in | lastlog 文件中没有该用户的记录位 |
💡 说明:
**Never logged in**的字面语义是「lastlog 文件中没有这个用户的记录」,但不等于「这个用户从未登录过」——三种情形会让它失真:① 记录被-C清除(见 3.6);② root 用-S伪造/清除过记录;③ UID 复用——lastlog 按 UID 寻址,删除老用户后新建同 UID 的账号会落到原记录位上。审计结论必须与 wtmp 流水(last)交叉验证。
另外注意:系统账号(daemon、sshd 等)全部 Never logged in 属正常现象——它们本就不允许交互登录;若这些账号反而出现了登录记录,才是需要警觉的异常信号。
3.2 -u, --user:指定用户(用户名 / UID / 区间)
-u 后接用户名,只显示该用户的记录:
$ lastlog -u u4b1
Username Port From Latest
u4b1 pts/6 ::1 Thu Oct 15 08:51:45 +0000 2026
-u 的参数不只收用户名,还接受 UID 与 UID 区间(连字符写法),一次性查出 1002~1003 两个账号:
$ lastlog -u 1002-1003
Username Port From Latest
u4b1 pts/6 ::1 Thu Oct 15 08:51:45 +0000 2026
u4b2 pts/5 ::1 Thu Oct 15 08:51:45 +0000 2026
💡 要点:UID 区间是批量巡检的利器——普通用户通常分配在 1000+ 段,
lastlog -u 1000-1999可以一次圈出整段账号的登录状态(本机测试账号 uid 从 1002 起,故以 1002-1003 演示)。
3.3 -u 的重复覆盖陷阱
想一次查两个用户,直觉写法是重复给 -u——实测结果出人意料:只显示了后面的 u4b2,u4b1 被丢弃:
$ lastlog -u u4b1 -u u4b2
Username Port From Latest
u4b2 pts/5 ::1 Thu Oct 15 08:51:45 +0000 2026
这不是 bug:lastlog 内部只保留一个「当前用户/区间」变量,命令行上重复出现的 -u 后者覆盖前者,并不求并集。要查多个用户,正确姿势是用 UID 区间(3.2)或分多次执行。
3.4 -t, --time DAYS:只看最近 N 天内的记录
-t 1 表示只显示「最近 1 天之内有过登录」的用户——从未登录的 Never 用户直接被过滤:
$ lastlog -t 1
Username Port From Latest
u4b1 pts/6 ::1 Thu Oct 15 08:51:45 +0000 2026
u4b2 pts/5 ::1 Thu Oct 15 08:51:45 +0000 2026
💡 要点:
-t是「活跃账号巡检」的第一入口——配合定时任务周期跑lastlog -t 7,即可拿到周内活跃账号清单;另一头的不活跃盘点交给-b(3.5)。
3.5 -b, --before DAYS:只看早于 N 天的记录
-b 30 显示「最近一次登录早于 30 天前」的用户。实测输出里 u4b1/u4b2(10 分钟前刚登录)被排除,其余全部命中——从未登录过的用户也一并列出:
$ lastlog -b 30
Username Port From Latest
root **Never logged in**
daemon **Never logged in**
bin **Never logged in**
sys **Never logged in**
sync **Never logged in**
games **Never logged in**
man **Never logged in**
lp **Never logged in**
mail **Never logged in**
news **Never logged in**
uucp **Never logged in**
proxy **Never logged in**
www-data **Never logged in**
backup **Never logged in**
list **Never logged in**
irc **Never logged in**
gnats **Never logged in**
nobody **Never logged in**
_apt **Never logged in**
u4d1 **Never logged in**
u4d2 **Never logged in**
systemd-network **Never logged in**
systemd-resolve **Never logged in**
messagebus **Never logged in**
systemd-timesync **Never logged in**
sshd **Never logged in**
u4a-demo **Never logged in**
对 Never 用户而言「没有记录」被视作无限久远,因此落入 -b 的筛选范围。-b 30 的输出天然就是一份「30 天不活跃 + 从未登录」账号清单,是清理休眠账号、收缩攻击面的初筛工具;而「最近登录过的」交给 -t,两者正好互补。
3.6 -S / -C:记录置位与清除(写操作)
shadow 的 lastlog 不只是查询工具,还带两个写开关。先准备一个全新测试用户 u4b3(环境准备阶段用 useradd 创建,过程从略),它的记录位为空:
$ lastlog -u u4b3
Username Port From Latest
u4b3 **Never logged in**
-S 把该用户的记录置为当前时间,命令静默成功、无任何输出;再查,记录已经出现:
$ lastlog -u u4b3 -S
$ lastlog -u u4b3
Username Port From Latest
u4b3 lastlog localhost Thu Oct 15 08:55:02 +0000 2026
注意这条记录的 Port 列显示 lastlog、From 列显示 localhost——它由 lastlog 命令自身写入,并不是任何真实登录会话。-C 再把记录清除,回到 Never 状态:
$ lastlog -u u4b3 -C
$ lastlog -u u4b3
Username Port From Latest
u4b3 **Never logged in**
💡 安全提示:帮助原文写明
-S/-Cusable only with -u(只能与-u搭配),本组实测均按该约定执行。更重要的结论是:root 可以用-S随手伪造一条「刚刚登录过」的记录(Port=lastlog 是它的指纹),所以 lastlog 不能单独作为审计证据,务必与 wtmp 流水交叉验证——这层风险在第五节 Q1 再展开。
3.7 -R, --root:指定 chroot 根目录
-R CHROOT_DIR 让 lastlog 去读 <目录>/var/log/lastlog。传 / 即读本机文件,行为与默认完全一致:
$ lastlog -R / -u u4b1
Username Port From Latest
u4b1 pts/7 ::1 Thu Oct 15 08:57:14 +0000 2026
两个信息点:其一,-R / 输出正常,说明该参数只是在文件路径前拼前缀;其二,此刻 u4b1 的记录已从 3.1 全表中的 pts/6 08:51:45 更新为 pts/7 08:57:14——因为 08:57 的第二轮登录发生在全表抓取之后(时间线见 2.1),旧记录被覆盖,正好实证了「每用户只存最近一次」。
💡 技术拓展:
-R的典型用途是离线取证。救援环境或把别的机器的磁盘挂载到本机某目录后,lastlog -R /mnt即可读取那台机器的最近登录表;这也正是 lastlog 没有-f时读「别的文件」的官方替代路径(对照见 3.8)。
3.8 不存在的 -f:快照文件怎么读?
util-linux 系的 last、who 都能用 -f 指定任意记录文件,lastlog 偏偏没有这个参数。实测传入直接被拒:
$ lastlog -f /var/log/lastlog -u u4b2
lastlog: invalid option -- 'f'
Usage: lastlog [options]
Options:
-b, --before DAYS print only lastlog records older than DAYS
-C, --clear clear lastlog record of an user (usable only with -u)
-h, --help display this help message and exit
-R, --root CHROOT_DIR directory to chroot into
-S, --set set lastlog record to current time (usable only with -u)
-t, --time DAYS print only lastlog records more recent than DAYS
-u, --user LOGIN print lastlog record of the specified LOGIN
本组实测已按取证习惯预先固化了快照副本:
$ ls -lh /root/demo/lastlog/lastlog-snapshot
-rw-r--r-- 1 root root 571K Oct 15 09:07 /root/demo/lastlog/lastlog-snapshot
但快照放在哪里都读不了——-f 不存在,lastlog 只认运行时根下的 /var/log/lastlog。想读快照只有两条路:
-R指向快照所在目录树的根:把快照放到<dir>/var/log/lastlog的位置,用lastlog -R <dir>读取(-R机制已在 3.7 验证);- 临时替换:在登录写入的静默窗口期,备份原件后把快照拷到
/var/log/lastlog,查完恢复——操作重、有污染在线文件的风险,能走-R就别走这条。
💡 要点:对 lastlog 做快照的意义相对有限——它每用户只有一条记录,完整历史本就不在它身上;要保「全过程」,快照对象应该是 wtmp(用
last -f离线分析,见姊妹篇《last 命令详解与参数实测(Ubuntu 22.04)》4.5 场景)。lastlog 快照主要防的是「审计期间记录被后续登录覆盖」。
3.9 稀疏文件:584000 字节为什么只占 52K?
lastlog 文件的逻辑大小与磁盘占用差距悬殊,三组实测数据放在一起看:
$ wc -c /var/log/lastlog
584000 /var/log/lastlog
$ du -h /var/log/lastlog
52K /var/log/lastlog
$ ls -l /var/log/lastlog
-rw-r--r-- 1 root utmp 584000 Oct 15 09:04 /var/log/lastlog
原理:lastlog 文件按 UID 直接偏移寻址——每个用户在文件里占一个固定长度的记录槽,槽位由 UID 决定。当系统里存在较大 UID 的账号时(哪怕从未登录),文件的逻辑长度必须覆盖到那个 UID 的偏移;但从未写入过的槽位不分配磁盘块,于是形成「空洞」。逻辑大小(ls、wc -c 看到的)584000 字节,实际磁盘占用(du 看到的)只有 52K,这就是稀疏文件。
💡 技术拓展:同一个文件在不同命令眼里的「大小」——
命令 视角 实测值 含义 ls -l 逻辑大小 584000 文件「应有」的字节数(覆盖到最高 UID 的记录槽) wc -c 逻辑大小 584000 同上,按字节流计数 du -h 磁盘占用 52K 实际分配的存储块,稀疏「洞」不计入 两个运维影响:① 备份/复制稀疏文件时注意保留空洞语义(如 cp 的 --sparse 选项),否则备份产物会从 52K 膨胀到逻辑大小;② 监控磁盘水位的脚本要用 du 视角,拿逻辑大小算容量会虚报。
四、实战示例
4.1 场景一:账号失陷初查(lastlog + last 交叉)
告警称 u4b1 账号行为异常。第一步看它的「最近一次登录」:
$ lastlog -u u4b1
Username Port From Latest
u4b1 pts/6 ::1 Thu Oct 15 08:51:45 +0000 2026
第二步用 last 拉完整轨迹(-F 取秒级时间、-a 把来源置尾方便提取):
$ last -a -F -n 4 u4b1
u4b1 pts/7 Thu Oct 15 08:57:14 2026 - Thu Oct 15 08:57:20 2026 (00:00) ::1
u4b1 pts/6 Thu Oct 15 08:57:14 2026 - Thu Oct 15 08:57:20 2026 (00:00) ::1
u4b1 pts/6 Thu Oct 15 08:51:45 2026 - Thu Oct 15 08:53:50 2026 (00:02) ::1
u4b1 pts/4 Thu Oct 15 08:46:36 2026 - Thu Oct 15 08:46:36 2026 (00:00) ::1
wtmp begins Thu Oct 15 08:46:34 2026
两相对照正好暴露两个工具的分工:lastlog 显示的 pts/6 08:51:45 在 last 的轨迹里只是第 3 条——它后面还有 08:57 的两次登录(lastlog 抓取时点早于这两次,见 2.1 时间线)。初查用 lastlog 定位「最近一次」,深查必须落回 last 的流水。
4.2 场景二:UID 段批量巡检
安全基线要求「普通用户段逐一核对最近登录」——UID 区间一次圈定:
$ lastlog -u 1002-1003
Username Port From Latest
u4b1 pts/6 ::1 Thu Oct 15 08:51:45 +0000 2026
u4b2 pts/5 ::1 Thu Oct 15 08:51:45 +0000 2026
生产环境把区间换成 lastlog -u 1000-1999 即可覆盖常规普通用户段;想反向盘点「长期不活跃」,再用 -b(3.5)交叉。
4.3 场景三:休眠与从未登录账号盘点
清理休眠账号的初筛一步到位:lastlog -b 30(完整回显见 3.5)输出的 27 行全部是「30 天内未登录或从未登录」的账号,root 等系统服务账号也在其中。实际执行账号清理时注意两点:系统服务账号(sshd、messagebus 等)本就不该有登录记录,不要把它们当休眠用户删掉;真正要处理的是 1000+ 段里长期不活跃的普通账号,可先禁用(usermod -L 或改 shell 为 nologin)观察一段时间再删除。
4.4 场景四:记录置位/清除演练与伪造风险
按 3.6 的顺序在测试账号上演练即可掌握写操作的手感:lastlog -u u4b3 -S 静默置位 → 查询确认 Port=lastlog、From=localhost 的指纹 → lastlog -u u4b3 -C 清除回 Never(完整回显见 3.6)。生产上的合理用途只有两类:① 测试 lastlog 报表/告警链路时构造数据;② 在安全演练中演示「lastlog 可被 root 伪造」这一风险点,教育团队不要单独采信 lastlog。
4.5 场景五:跨盘取证(-R)
取证机拿到一块服务器的系统盘,挂载后无需启动对方系统即可读其登录表。流程示意如下(其中 -R 的读取行为已在 3.7 实测验证):
mkdir -p /mnt/rescue
mount /dev/sdb2 /mnt/rescue
lastlog -R /mnt/rescue
输出格式与本机一致。对比两条路的成本:-R 只读、零风险,是首选;替换 /var/log/lastlog 的做法留作 -R 不可用时的最后手段(风险评估见 3.8)。
五、注意事项与常见问题
Q1:**Never logged in** 就代表这个用户真的从未登录过吗?
不一定。它只表示「lastlog 文件中没有该用户的记录」,三种情形会让它失真:① root 用 -C 清除过记录(3.6 实测);② root 用 -S 伪造过记录再清除;③ UID 复用——lastlog 按 UID 寻址,删除老用户后新建同 UID 账号会落到原记录位。审计中 lastlog 只能做初筛,结论必须落到 wtmp 流水(last)上交叉验证。
Q2:lastlog 显示的时间为什么和 last 对不上? 两个原因叠加:① lastlog 每用户只保留最近一次,之后每次登录都会覆盖(本组实测:全表时 u4b1 是 08:51:45,第二轮登录后变 08:57:14,见 3.7);② 两个工具的抓取时刻不同。用 last 加用户名过滤拿完整轨迹再下结论(4.1 场景)。
Q3:-u 想同时查两个用户为什么只出来一个?
lastlog 内部只保留一个用户/区间过滤变量,重复的 -u 后者覆盖前者(3.3 实测:-u u4b1 -u u4b2 只显示 u4b2)。批量查询用 UID 区间写法 -u 1002-1003。
Q4:为什么 lastlog 既没有 --version 也没有 -f?
lastlog 属 shadow 套件(login 包),与 util-linux 系的 last/who 风格不同:无 -V/--version(2.3 实测报 unrecognized option)、无 -f 文件参数(3.8 实测报 invalid option)。版本走 dpkg -S + dpkg -l login;读别的文件走 -R(3.7)或临时替换(3.8)。
Q5:-S/-C 可以不带 -u 吗?
帮助原文明确标注 usable only with -u,只能与 -u 搭配,本组实测均按此约定执行。另外两者执行成功时没有回显(静默成功),脚本里判断成败不要依赖输出,建议结合退出码判断。
Q6:系统账号一片 Never logged in 正常吗? 正常。daemon、sshd、nobody 等服务账号本就不允许交互登录,没有登录记录才是健康状态;反过来,若它们出现登录记录(尤其是 sshd、sync 这类),要立刻警觉并核对 last/wtmp——这往往意味着账号的 shell 被改动或被人利用。
Q7:lastlog 的记录是谁在什么时候写进去的?
成功登录时由登录链路写入:本机 u4b1/u4b2 通过 SSH 登录后,Port/From 立即出现 pts/N 与 ::1(3.1/3.2 回显)。手工置位的记录有指纹——Port 列显示 lastlog、From 列显示 localhost(3.6),据此可以区分自然记录与人为记录。
Q8:/var/log/lastlog 显示 584000 字节,是不是被什么撑爆了?
不是,是稀疏文件(3.9):按 UID 偏移寻址 + 未写入槽位不占磁盘块。逻辑大小与磁盘占用要分开看(ls/wc -c 看到前者,du 看到后者);备份时注意稀疏语义,否则备份产物会膨胀 11 倍以上。
六、参考链接
- lastlog(1) 手册页(Ubuntu 22.04 jammy):https://manpages.ubuntu.com/manpages/jammy/en/man1/lastlog.1.html
- shadow 套件上游源码仓库:https://github.com/shadow-maint/shadow
- utmp/wtmp/btmp/lastlog 记录格式(utmp(5)):https://man7.org/linux/man-pages/man5/utmp.5.html
- 姊妹篇:《last 命令详解与参数实测(Ubuntu 22.04)》《users 命令详解与参数实测(Ubuntu 22.04)》《su 命令详解与参数实测(Ubuntu 22.04)》