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 实测通过。

Linux命令Linux系统UbuntuUbuntu 22.04命令行网络工具2026/10/16

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.

逐行解读:

  1. Login: root——登录名;Name: root——/etc/passwd 第 5 字段(GECOS)中的真实姓名。
  2. Directory: /root——家目录;Shell: /bin/bash——登录 shell。
  3. 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.。
  4. No mail.——本地邮箱无未读;有未读邮件时显示 Mail last read ... 之类的形态。
  5. 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 技术拓展:用户信息查询工具对比

「看一眼这台机器上有哪些人」有一族工具,横向对比——

工具数据源输出侧重典型场景
fingerutmp + lastlog + GECOS登录会话 + 个人信息(Idle/plan)综合画像(本文主线)
whoutmp在线会话最小集快速看谁在线
wutmp + 进程表会话 + 正在做什么 + 负载值班巡检首选
last / lastlogwtmp / lastlog历史登录 / 每用户最近一次追溯登录史
usersutmp仅用户名去重列表一句话点名

💡 关键差异一句话: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 无妨,跨网查询一律避免。这就是它今天淡出主流的原因。

六、参考链接