finger 命令详解与参数实测(Ubuntu 22.04)
finger 命令逐参数实测详解:无参登录列表、Login/Name/Directory/Shell/On since/Mail/Plan 全字段逐行解读、.plan 与 .project 写入对照及经典运维文化、-l/-s 长短格式、-p 屏蔽自述文件、多用户查询与 user@host 远程形态,含 who/w 选型对比、退出码陷阱与安全风险,全部回显在 Ubuntu 22.04 实测通过。
finger 命令详解与参数实测(Ubuntu 22.04)
目标:全面掌握 finger 的每一个常用参数——无参数列出登录用户、单用户查询的 Login/Name/Directory/Shell/On since/Mail/Plan 全字段解读、
-l/-s长短格式切换、-p屏蔽 .plan/.project、多用户查询与不存在用户/远程user@host形态,以及 .plan/.project 文件的经典运维文化,全部命令与回显已在 Ubuntu 22.04 实测通过。
一、环境信息
- 操作系统:Ubuntu 22.04.5 LTS(x86_64)
- finger 实现:BSD finger 客户端(
/usr/bin/finger,包名finger) - finger 包版本:0.17-17(
dpkg -l finger实测) - 演示用户:
root(登录中,pts/0)与tester(已创建但未登录的普通用户) - 演示文件:
/root/.project与/root/.plan - 系统时区:UTC(回显中的时间即 UTC)
Ubuntu 22.04 默认不带 finger 命令,需先安装。安装过程实测(节选):
$ apt-get install -y finger
Setting up finger (0.17-17) ...
finger 的「登录状态」来自 utmp 数据库(/var/run/utmp),「最近登录」来自 lastlog 数据库(/var/log/lastlog)。本演示环境准备了一个处于登录态的 root 会话,并用 util-linux 的 utmpdump 工具确认其 utmp 记录(这也是排查 finger 输出异常时的标准检查手段):
$ utmpdump /var/run/utmp
Utmp dump of /var/run/utmp
[6] [00000] [~~ ] [reboot ] [~ ] [0.0.0.0 ] [0.0.0.0 ] [2026-10-15T06:16:35,000000+00:00]
[7] [20001] [p1 ] [root ] [pts/0 ] [10.20.30.40 ] [10.20.30.40 ] [2026-10-16T00:48:02,000000+00:00]
第二条 [7](USER_PROCESS 类型)即 root 在 pts/0 上的登录会话记录,来源地址为演示用内网地址 10.20.30.40——下文所有 On since ... from 10.20.30.40 信息均源于此。
二、命令概览
2.1 语法与参数总览
finger 用于查询本地或远端用户的公开信息:真实姓名、家目录、登录 shell、登录状态、邮件状况,以及用户自写的 .plan/.project 签名文件。参数总览(usage 实测 + man finger 汇总):
| 参数 | 作用 | 本篇实测节 |
|---|---|---|
| (无参数) | 列出当前所有登录用户(短格式) | 3.1 |
login | 查询指定用户(单用户时自动用长格式) | 3.2 |
-l | 强制长格式(多行详细输出) | 3.4 |
-s | 强制短格式(单行表格) | 3.5 |
-p | 不显示 .plan/.project 内容 | 3.6 |
-m | 精确匹配用户名(不匹配真实姓名等字段) | —(本文未展开) |
user@host | 查询远端主机上的用户(需远端 fingerd 服务) | 3.9 |
完整 usage(finger --help 的实测回显,见 2.2):
usage: finger [-lmps] [login ...]
💡 技术拓展:finger 常与 who、w 混淆,三者定位不同——
工具 信息范围 典型问题 输出重心 who 当前登录者(utmp) 谁在线 一行一个会话:用户、终端、来源、时间 w 在线者 + 系统负载 他们在干什么 uptime 表头 + 每会话的当前进程 finger 账号静态信息 + 登录态 + 自述文件 这人是谁、最近来过吗、他在计划什么 GECOS/家目录/shell/.plan/.project 一句话分工:查「在线名单」用 who,查「在跑什么」用 w,查「这个人」用 finger。
2.2 帮助形态:--help 的实测回显
finger 0.17 不认识 --help 长选项,传入后按 usage 报错:
$ finger --help
finger: invalid option -- '-'
usage: finger [-lmps] [login ...]
可用选项一目了然:只有 -l、-m、-p、-s 四个。finger -Z(无效短选项)得到同样的 usage 与 rc=1。
2.3 版本信息
$ which finger; dpkg -S $(which finger)
/usr/bin/finger
finger: /usr/bin/finger
$ dpkg -l finger | tail -1
ii finger 0.17-17 amd64 user information lookup program
$ apt policy finger 2>/dev/null | head -3
finger:
Installed: 0.17-17
Candidate: 0.17-17
包名 finger、版本 0.17-17(BSD finger 0.17 系)。finger 自身无 --version 选项,版本以包管理器为准。
三、参数逐项实测
3.1 无参数:列出当前登录用户
不带任何参数,finger 以短格式列出 utmp 中的登录会话:
$ finger
Login Name Tty Idle Login Time Office Office Phone
root root pts/0 Oct 16 00:48 (10.20.30.40)
列语义:Login 登录名、Name 真实姓名(GECOS 字段)、Tty 终端设备、Idle 空闲时长(分钟;为空表示不足 1 分钟)、Login Time 登录时间、Office/Office Phone 来自 GECOS 的办公室字段(本例为空)。括号里的 10.20.30.40 是登录来源地址。
💡 要点:无参 finger 是「谁在线」的全景视图,与
who/w同源(都读 utmp)但多了 Idle 与 Office 列;Idle 列是 finger 独有的快速信号——值班巡检时先看谁长时间空闲,比 w 的 load 平均值更直接指向「该找人还是该找机器」。
3.2 finger 用户:全字段逐段解读
查询单个用户时自动使用长格式。先看该用户还没有 .plan/.project 时的输出:
$ finger root
Login: root Name: root
Directory: /root Shell: /bin/bash
On since Fri Oct 16 00:48 (UTC) on pts/0 from 10.20.30.40
No mail.
No Plan.
逐行解读:
Login: root——登录名;Name: root——/etc/passwd 第 5 字段(GECOS)中的真实姓名。Directory: /root——家目录;Shell: /bin/bash——登录 shell。On since Fri Oct 16 00:48 (UTC) on pts/0 from 10.20.30.40——当前在线:登录时刻、时区、终端、来源地址。这行只在 utmp 里有该用户的 USER_PROCESS 记录时出现;若不在线且 lastlog 有历史记录,则显示Last login ...;两者都无则是Never logged in.。No mail.——本地邮箱无未读;有未读邮件时显示Mail last read ...之类的形态。No Plan.——家目录下没有.plan文件(下一节写入后再对照)。
一个用户可同时登录多个终端,此时每个终端一条 On since 行。双终端在线的实测形态:
$ finger root
Login: root Name: root
Directory: /root Shell: /bin/bash
On since Fri Oct 16 00:50 (UTC) on pts/0 from 10.20.30.40
On since Fri Oct 16 00:50 (UTC) on pts/1 from 10.20.30.41
No mail.
No Plan.
两条 On since 分别对应 pts/0(来自 10.20.30.40)与 pts/1(来自 10.20.30.41)两个会话,排障时可用它快速确认「这个账号从哪几台机器登进来了」。
💡 要点:
finger 用户名是多终端排查的标准入口——一个账号出现两条On since行(不同 pts、不同来源 IP)要么是正常多会话,要么是账号被他人借用;结合last 登录名看历史登录源,能快速还原「谁在什么时候从哪里进来」。
3.3 .plan 与 .project:写入前后对照
.plan 与 .project 是 finger 的「自述文件」:家目录下这两个文本文件的内容会被 finger 原样展示,是 finger 时代经典的个人签名/状态文化。写入并对照:
$ printf 'Linux command column - doc engineer' > /root/.project
$ printf 'This box is a demo host for doc testing.\nPlan file can contain multiple lines,\nfinger prints them as-is.' > /root/.plan
$ cat /root/.project; echo ---; cat /root/.plan
Linux command column - doc engineer---
This box is a demo host for doc testing.
Plan file can contain multiple lines,
finger prints them as-is.
再次查询,输出末尾新增了两个段落:
$ finger root
Login: root Name: root
Directory: /root Shell: /bin/bash
On since Fri Oct 16 00:48 (UTC) on pts/0 from 10.20.30.40
No mail.
Project:
Linux command column - doc engineer
Plan:
This box is a demo host for doc testing.
Plan file can contain multiple lines,
finger prints them as-is.
.project 按一行展示(约定放一句话签名);.plan 多行原样展示。两者都存在时 Project 在前、Plan 在后。
💡 要点:.plan 文件是 finger 的灵魂——上世纪 90 年代,工程师们在 .plan 里写工作计划、签名档甚至日记,形成独特的「.plan 文化」;今天它仍可用于服务器上的轻量状态公告(谁维护、维护窗口、联系方式)。另外 finger 对 .plan/.project 中的非 ASCII 字节会做转义显示(见五、Q2),写中文签名会变乱码,建议用 ASCII 英文。
3.4 -l:强制长格式
$ finger -l root
Login: root Name: root
Directory: /root Shell: /bin/bash
On since Fri Oct 16 00:48 (UTC) on pts/0 from 10.20.30.40
No mail.
Project:
Linux command column - doc engineer
Plan:
This box is a demo host for doc testing.
Plan file can contain multiple lines,
finger prints them as-is.
单用户查询默认就是长格式,-l 的价值在于强制:当查询多个用户(默认退化为短格式表格)但仍想看某个用户的详细信息时使用。
💡 要点:多用户 +
-l的输出是「每人一整段」,适合逐人审阅;不加快捷批量审阅时更常见的组合是finger -s看全表 + 对可疑者单独finger 用户名深查。
3.5 -s:强制短格式
$ finger -s root
Login Name Tty Idle Login Time Office Office Phone
root root pts/0 Oct 16 00:48 (10.20.30.40)
与 3.1 的无参输出同构,把长格式用户压缩成一行表格行。适合在脚本里提取「谁在线」的机器友好形态(本例实测时本机恰好有两个 root 会话,故输出两行):
$ finger -s | awk '{print $1}'
Login
root
root
(表头 Login 与各登录名逐行输出;配合 tail -n +2 可跳过表头。)
💡 要点:
-s与无参输出同构但语义不同——-s是「对指定用户强制短格式」,无参是「对全系统登录会话短格式」。脚本提取在线名单优先finger -s加列裁剪,或直接who(输出更简洁稳定)。
3.6 -p:不显示 .plan/.project
$ finger -p root
Login: root Name: root
Directory: /root Shell: /bin/bash
On since Fri Oct 16 00:48 (UTC) on pts/0 from 10.20.30.40
No mail.
对照 3.4:Project: 与 Plan: 两个段落消失,其余字段不变。查询他人信息但不想看(或不便展示)个人自述时使用。
💡 要点:
.plan/.project是早期 Unix 的「个人签名档」传统(用户在家目录自述近况);-p屏蔽它们的价值一是输出干净、二是规避自述内容里可能的不当信息——在审计/客服场景对他人做信息查询时,-p是更职业的默认选择。
3.7 多用户查询:finger root tester
一次查询多个用户,输出按用户分段,且自动退化为短格式:
$ finger root tester
Login Name Tty Idle Login Time Office Office Phone
root root pts/0 Oct 16 00:48 (10.20.30.40)
Login: tester Name:
Directory: /home/tester Shell: /bin/bash
Never logged in.
No mail.
No Plan.
注意两点:root 段是短格式表格行(多用户时短格式优先);tester 从未登录过,于是给出 Never logged in.(lastlog 中无记录)而不是 On since 行。想同时看多人的长格式,用 finger -l root tester。
💡 要点:
Never logged in.的数据源是 lastlog 而非 utmp——「从未登录」与「当前不在线」是两个维度。finger 的输出混合了 utmp(在线会话)与 lastlog(最近登录)两套账本,读输出时先分清当前看的是哪一段。
3.8 不存在的用户
$ finger nosuchuser; echo rc=$?
finger: nosuchuser: no such user.
rc=0
报错信息清晰,但退出码是 0——BSD finger 0.17 即使没查到目标用户也返回成功。做监控/脚本判断时不能依赖 $?,必须解析输出文本(grep no such user)。
💡 要点:finger 的「查无此人也返回 0」是 BSD 血统的历史行为——它把「查询成功(含空结果)」与「查询失败」分开看待。脚本断言「用户是否存在」改用
id 用户名(查不到 rc≠0)或getent passwd 用户名,finger 只适合人看。
3.9 user@host:远程查询形态(fingerd 未启用)
finger 支持 用户@主机 形式向远端主机的 fingerd(TCP 79 端口)发起查询。本环境未启用 fingerd,实测其失败形态:
$ finger root@127.0.0.1; echo rc=$?
finger: connect: Connection refused
rc=1
Connection refused 表明本机 79 端口无服务监听(Ubuntu 22.04 不预装 fingerd)。不带用户名的 finger @host 形态用于列出远端主机上的全部登录者,失败形态相同:
$ finger @127.0.0.1; echo rc=$?
finger: connect: Connection refused
rc=1
需要远端可查时须在目标机安装并启用 fingerd——但注意五、Q4 的安全忠告,生产环境通常不建议开启。
💡 要点:
user@host形态依赖目标机 79 端口的 fingerd 服务(明文协议、泄露用户清单,现代系统默认不装);finger @host(空用户名)= 列远端登录者,失败形态同为 refused。这两类查询在现代网络几乎注定失败,理解语义即可,实际排障用ssh host w替代。
3.8 技术拓展:用户信息查询工具对比
「看一眼这台机器上有哪些人」有一族工具,横向对比——
| 工具 | 数据源 | 输出侧重 | 典型场景 |
|---|---|---|---|
| finger | utmp + lastlog + GECOS | 登录会话 + 个人信息(Idle/plan) | 综合画像(本文主线) |
| who | utmp | 在线会话最小集 | 快速看谁在线 |
| w | utmp + 进程表 | 会话 + 正在做什么 + 负载 | 值班巡检首选 |
| last / lastlog | wtmp / lastlog | 历史登录 / 每用户最近一次 | 追溯登录史 |
| users | utmp | 仅用户名去重列表 | 一句话点名 |
💡 关键差异一句话:finger 是「信息最全」但依赖目标系统开通 fingerd(现代默认关闭)——单机 finger 查询本机用户安全无虞,网络 fingerd 服务因明文泄露用户信息早已被时代淘汰。本文以 finger 单机用法为主线;日常巡检建议
w(在线+动作)+last(历史)组合,finger 留给需要 GECOS/Idle 细节的场景。
四、实战示例
4.1 排查「某账号最近是否登录过」
安全审计高频动作:确认一个账号近期有没有人用过。
$ finger -l tester
Login: tester Name:
Directory: /home/tester Shell: /bin/bash
Never logged in.
No mail.
No Plan.
Never logged in. 即 lastlog 无记录;若显示 Last login ... 则可读出最近一次登录时间与来源。批量审计示例(循环提取每个账号的登录状态行):
$ for u in root tester; do echo "== $u"; finger -l $u | head -4 | tail -2; done
== root
On since Fri Oct 16 00:50 (UTC) on pts/0 from 10.20.30.40
On since Fri Oct 16 00:50 (UTC) on pts/1 from 10.20.30.41
== tester
Never logged in.
No mail.
每个账号两行摘要:在线账号给出全部 On since 行,离线账号给出 Never logged in./No mail.。全账号扫描把循环体换成 awk -F: '{print $1}' /etc/passwd 的结果即可。
4.2 团队状态板:用 .plan 做轻量公告
管理员给维护账号写 .plan,任何人 finger 一下就能看到当前值班/维护安排(3.3 的写入与展示即本例的完整流程)。配合 -p 可以只看账号属性、跳过自述内容;配合 -s 可生成在线名单。
4.3 服务探活:finger 命令兼作 fingerd 探测器
无需 nc/telnet,finger 自身就能探测目标主机是否开放 finger 服务:
$ finger root@127.0.0.1; echo rc=$?
finger: connect: Connection refused
rc=1
rc=1 且 Connection refused 说明 79 端口未开;若返回用户信息则说明目标机 fingerd 在跑(安全扫描时这也是一条信息泄露检查项,见 Q4)。
五、注意事项与常见问题
Q1:为什么我 finger 某用户看不到 On since 行?
三步排查:① 该用户是否真的在线——who/w 确认 utmp 里有它的 USER_PROCESS 记录;② 有 utmp 记录才显示 On since,仅剩历史记录显示 Last login(读 lastlog),两者皆无显示 Never logged in.;③ utmp 文件异常(/var/run/utmp 权限或内容损坏)时所有在线信息都会缺失,可用 utmpdump /var/run/utmp 检查原始记录。
Q2:.plan 里的中文为什么显示成乱码?
finger 0.17 对 .plan/.project 输出中的非 ASCII 字节做可见化转义(形如 M-^V 的序列),本环境实测中文内容会变成转义混合形态,且与 LC_ALL 语言环境无关。finger 协议(RFC 1288)本身假定 ASCII,建议 .plan/.project 只写英文。
Q3:finger 查不到用户为什么退出码还是 0?
实现使然:BSD finger 0.17 仅在自身运行出错(如选项非法、网络失败)时返回非 0,no such user 属于「正常查询结果」。脚本判断请解析文本而非依赖 rc(见 3.8;远程形态的 Connection refused 则 rc=1)。
Q4:finger 有哪些安全风险? finger 会暴露账号存在性、真实姓名、家目录、shell、登录时间与来源 IP、在线状态——这些正是攻击者做用户名枚举与社工的原料;.plan/.project 还可能被写入敏感内容。建议:生产系统不安装/不启用 fingerd,防火墙封 TCP 79;本机查询用 finger 无妨,跨网查询一律避免。这就是它今天淡出主流的原因。
六、参考链接
- Ubuntu 手册页(finger 0.17,与本环境同版本):https://manpages.ubuntu.com/manpages/jammy/en/man1/finger.1.html
- Finger 用户信息协议 RFC 1288:https://www.rfc-editor.org/rfc/rfc1288
- fingerd 守护进程手册页:https://manpages.ubuntu.com/manpages/jammy/en/man8/fingerd.8.html
- utmpdump 与 utmp/wtmp/lastlog 数据库说明:https://manpages.ubuntu.com/manpages/jammy/en/man1/utmpdump.1.html
- lastlog 数据库格式(finger 的 Last login 来源):https://man7.org/linux/man-pages/man5/lastlog.5.html