Finger:永不消亡的社交网络
摘要
Finger 是一种1971年的网络协议,开创了社交网络功能,例如通过 .plan 文件实现用户在线状态和微博客功能,至今仍在现代系统上正常工作。
暂无内容
查看缓存全文
缓存时间: 2026/08/18 12:59
# Finger:永不消亡的1971年社交网络 | Andros Fenollosa
来源:https://en.andros.dev/blog/54572bc7/finger-the-1971-social-network-that-never-died/
听闻第一个社交网络可追溯至1971年,可能会让不少人感到惊讶。
无需账户、无需算法、无需中央服务器。你的全部个人资料仅由一个可自主控制的纯文本文件承载。**John Carmack**(id Software联合创始人,Doom与Quake程序员)曾将其用作开发日志。而你的操作系统很可能已预装了客户端,只是你尚未察觉。
但最不可思议的是,半个世纪后的今天它依然运作如常,甚至可能迎来复兴。
这便是Finger协议——你现在就可以尝试体验。
`finger`客户端在macOS和大多数Unix系统中已预装。Debian或Ubuntu用户可通过`apt install finger`安装。Windows系统也内置了`finger.exe`。若你是Emacs用户,则可直接使用包含在`net-utils.el`中的`M-x finger`命令。
```
finger [email protected]
```
该命令会随机显示托管在`happynetbox.com`上的Finger账户——这是众多便于发布的目录(主机)之一,即使没有自用服务器也能轻松使用。有趣吧?
但它的起源同样引人入胜。
## 起源
1971年,在斯坦福人工智能实验室(SAIL),研究员们共享一台运行WAITS分时系统的计算机。当时唯一能获知在线人员的方法是使用`WHO`命令,但它只会输出冗长难读的列表。
实验室工程师Les Earnest(https://exhibits.stanford.edu/ai/catalog/hg950nz1220)注意到一个每日重复的场景:
> 我常看到人们用手指划过WHO显示屏,念叨着“那是Don,那是Pattie,但不知Tom何时离开的”。
人们用手指划过屏幕——这便是协议名称的由来。Earnest编写了一个程序,以更人性化的格式呈现信息:真实姓名、位置,以及最重要的——每个终端闲置了多久。这位务实的工程师更倾向于面对面交流而非计算机对话。他想知道是否值得起身穿过走廊去寻找某人。
作为副产品,他发明了网络存在感,或者说社交网络。
1977年,该协议在Ken Harrenstien编写的RFC 742(https://www.rfc-editor.org/rfc/rfc742.html)中被正式规范。当时协议极为原始,仅三个站点支持:SAIL、SRI和MIT的ITS机器。不久后,Earl Killian(MIT)和Brian Harvey(斯坦福)分别处理了网络实现。
1991年,RFC 1288(https://www.rfc-editor.org/rfc/rfc1288.html)作为最终规范发布,使早期版本成为历史。
### 最早的微型博客:.plan与.project文件
除协议本身,内容层面同样重要。Finger不仅能显示你是否在线,还会展示你主目录中两个文本文件的内容:`.plan`和`.project`。最初设想是用于宣告当前工作与未来计划——相当于一种静态的“专业状态”,无点赞评论等互动功能,如同记录日常或项目进展的变更日志。
但人们总能让技术人性化。他们开始在其中加入诗歌、笑话、个人日记、ASCII艺术、文章……包罗万象!任何人都可通过简单的`finger your-user@your-host`命令阅读你的`.plan`文件。许多人认为它确实是互联网上最早的微型博客。
如前所述,最著名的案例是**John Carmack**的`.plan`文件。多年来,任何粉丝只需输入`finger [email protected]`(现已停用),就能直接从源头了解他喜爱的游戏图形引擎的开发动态。他从1996年写到2010年。这些记录现已保存在GitHub(https://github.com/ESWAT/john-carmack-plan-archive)上。作为电子游戏史上最具价值的技术文献之一,它竟通过1971年的协议传播——简直怒不可遏!
但别期待字字珠玑。他的风格如电报般简洁:任务清单与缺陷列表,毫无赘言。不过偶尔也会投下重磅炸弹。例如1997年8月18日,他通过`.plan`(而非网站或发布会)宣布将发布Doom源代码:
```
-----------------------------------------
John Carmack's .plan for Aug 18, 1997
-----------------------------------------
I get asked about the DOOM source code every once in a while, so here is a
full status update:
[...]
The DOOM code should be a lot more interesting. It is better written, 32 bit,
and portable. There are several interesting projects that immediately present
themselves for working with the code. GLDOOM and a packet server based
internet DOOM spring to mind.
```
荣耀处决!
### 物联网先驱的Finger实践
约1982年,卡内基梅隆大学的几位学生(Mike Kazar、David Nichols、John Zsarnay和Ivor Durham)厌倦了走到系里**可口可乐贩卖机**(https://www.cs.cmu.edu/~coke/coke.history.txt)前却发现空瓶或温热的饮料。他们安装了微动开关来检测每列瓶子的数量与冷藏时间。
他们将这一切联网,并通过Finger暴露状态。从任何计算机执行`finger [email protected]`(机器名称随年月更迭)不仅能知道是否有汽水,还能判断哪个按钮能取出最冰爽的饮料。这被视为史上最早的联网设备之一——物联网的鼻祖。而它的接口,再次是Finger。
## 协议解析
Finger之简单,一段话即可阐明。客户端向服务器79端口发起TCP连接,发送一行文本(查询用户名或空行以列出所有用户),以回车换行符终止。服务器返回纯文本响应后关闭连接。仅此而已!
无加密,无头部信息,无会话管理。极致的简洁。
```
sequenceDiagram
participant C as 客户端 (finger)
participant S as 服务器 (fingerd, 端口79)
C->>S: 建立到端口79的TCP连接
C->>S: "johnc" + CRLF
S->>C: ~johnc/.plan文件内容(纯文本)
S->>C: 关闭连接
```
基础命令如下:
```
finger user@server
```
因协议无任何隐秘,你甚至可通过`netcat`手动交互。通过标准输入向79端口发送用户名,读取响应:
```
echo "random" | nc happynetbox.com 79
```
这种体验会很熟悉,因为它的工作原理类似Whois、Gopher或SMTP等协议:连接、纯文本查询、读取响应。
## .plan文件的内容
`.plan`不是博文墙,而是一个可随意书写的纯文本文件。当他人finger你时,服务器会原样返回整个文件。无需格式约束,这里是狂野西部。
这意味着只能有一篇日志吗?不然。自80年代以来的惯例是在同一文件中以带日期条目维护日记体,通常最新条目置于顶部。John Carmack便是以这种方式发布了数年开发记录。他的`.plan`是用虚线分隔条目的递增文件:
```
-----------------------------------------
John Carmack's .plan for Jan 02, 1998
-----------------------------------------
Wired magazine does something that almost no other print magazine...
```
你的文件可以更简洁,包含个人简介与多个条目:
```
Emily Carter
海洋生物学家。咖啡、皮划艇与古地图爱好者。
--- 2026-08-14 ---
从海岸采样归来。需处理三瓶浮游生物样本。
--- 2026-08-05 ---
终于读完《沙丘》。现在能看懂半个互联网的梗了。
--- 2026-07-30 ---
有办法修理老是滑链的自行车吗?求支招。
```
当文件过长时,需手动修剪旧条目。没有数据库保存历史:`.plan`文件可随意修改且无版本控制,删除即消失。无法点击跳转其他个人资料,一切皆需手动。
与我们熟悉的服务对比:
| 平台 | 发布方式 | 多条目管理 | 历史记录 | 关注功能 | 回复与讨论 | 点赞与通知 | 结构化资料 | 浏览其他资料 | 发现用户 |
|--------------|------------------|--------------------------------|--------------------|------------------|--------------|------------|------------|------------------|------------------|
| Mastodon/X/Reddit | 每条观点单独发布 | 自动为每条记录分行 | 全部保存,支持永久链接 | 关注按钮与统一信息流 | 支持 | 支持 | 支持 | 链接与提及 | 算法推荐与趋势 |
| Finger(.plan) | 编辑单一文本文件 | 手动:同一文件中添加带日期条目 | 仅保留文件内容,无永久链接 | 手动finger或客户端聚合 | 原生不支持 | 不支持 | 不支持 | 不支持 | 口碑传播与社群列表 |
与现代社交网络相比显得简朴。现代服务优化了许多粗糙之处,但这里无关功能竞赛——只是承载你状态的个人文件而已。
## 衰落与复兴
Finger并非因时尚而式微,而是因安全问题退场。
1988年11月2日,**Morris蠕虫(https://en.wikipedia.org/wiki/Morris_worm)**——最早在互联网传播的蠕虫之一——爆发。其攻击向量之一便是`fingerd`守护进程的漏洞。蠕虫发送的请求造成缓冲区溢出,得以在远程机器执行代码。这可能是历史上首个恶意缓冲区溢出攻击,感染了约6000台计算机,约占当时互联网总量的10%!
更深层的问题在于设计缺陷:Finger会暴露用户信息——姓名、邮箱、日程及最后登录时间。RFC 1288本身就带有警告:
> 警告!!Finger会泄露用户信息;此类信息可能被视为敏感内容。
到90年代末,绝大多数管理员已禁用该服务。这个近20年的协议终于成为历史遗物——这已相当长寿。
转折随之而来:Finger已被遗忘,却又无处不在。2020年,安全研究人员发现(https://www.bleepingcomputer.com/news/security/windows-10-finger-command-can-be-abused-to-download-or-steal-files/)某些攻击者利用Windows默认安装的`finger.exe`下载恶意软件而不被察觉。这种技术称为**活在系统上(https://lolbas-project.github.io/lolbas/Binaries/Finger/)**:二进制文件已存在且受信任,几乎无人监控。Astaroth恶意软件(https://isc.sans.edu/diary/Guildma+is+now+using+Finger+and+Signed+Binary+Proxy+Execution+to+evade+defenses/27482)便借此获取有效载荷。一款70年代协议仍预装于所有Windows系统,足见其设计之成功。
简洁实用的理念极难消亡。看看现存多少Unix命令,其中许多比你的年龄还大。随着小型互联网的复兴,一系列极简、去中心化的协议(Gemini、IRC、RSS、NNTP等)涌现,Finger也重新崭露头角:
- **Happy Net Box(https://happynetbox.com/)**:由Ben Brown开发。`.plan`的现代重生,提供网页编辑界面与安全守护进程。试试`finger [email protected]`,或`finger [email protected]`(前文示例)阅读随机用户。
- **Finger.Farm(https://github.com/jonroig/finger.farm)**:Jon Roig开发的Node.js开源实现,支持网页、REST API或cURL更新,设计用于自托管。
- **plan.cat(https://plan.cat/)**:公共服务器并桥接ActivityPub协议,你的`.plan`可从Mastodon读取。
这是一个鲜活的协议,小巧可hack,由觉得它有趣的群体维持活力。
甚至有活跃账户目录:
```
finger [email protected]
```
相信还有更多我不了解的社群。
## 迈出第一步
### 简易方案:使用Happy Net Box类主机
无需配置。在happynetbox.com(https://happynetbox.com/)免费注册,在网页框中撰写文本并保存。此后全球任何人都可阅读:
```
finger [email protected]
```
该服务提供服务器与安全保障。这是分钟级创建公开`.plan`的完美途径,无需触碰控制台,零成本。若你来自Mastodon或X平台,这相当于“创建账户”。
### 进阶方案:在Linux部署Finger守护进程
若已有服务器(VPS或树莓派),可运行经典守护进程`fingerd`。它读取被查询用户的`~/.plan`文件并提供服务。Debian系统建议使用安全强化的`ffingerd`,这是公共服务的推荐选择。通过`inetd`超级服务器启动,该服务器监听79端口并在每次连接时启动守护进程。
```
sudo apt install openbsd-inetd ffingerd
```
在`/etc/inetd.conf`中添加此行并重载服务:
```
finger stream tcp nowait nobody /usr/sbin/tcpd /usr/sbin/ffingerd
```
```
sudo systemctl reload openbsd-inetd
```
现在创建你的plan文件(设为全局可读)并测试:
```
echo "Hi, I'm Bob. Today I'm working on my Finger server." > ~/.plan
chmod a+r ~/.plan
finger your-user@your-server
```
最后在防火墙开放79端口并将域名指向服务器。因Finger会暴露信息,请遵循Debian安全手册建议:使用`ffingerd`、限制连接主机、控制进程数量。
### 高阶方案:用Python编写自定义fingerd
若需完全控制并从内部理解协议,可编写自己的服务器。因Finger是基于socket的纯文本协议,仅需寥寥数行代码。以下是我用于提供`.plan`服务的脚本:
创建`fingerd.py`文件:
```
import asyncio
PLAN_FILE = "plan.txt"
async def handle(reader, writer):
# 读取客户端查询后忽略:仅提供单一plan文件。
await reader.readline()
try:
with open(PLAN_FILE, encoding="utf-8") as file:
body = file.read()
except FileNotFoundError:
body = "No plan yet.\n"
writer.write(body.encode("utf-8"))
await writer.drain()
writer.close()
async def main():
server = await asyncio.start_server(handle, "0.0.0.0", 79)
async with server:
await server.serve_forever()
asyncio.run(main())
```
创建`plan.txt`写入要发布的内容,然后启动:
```
sudo python3 fingerd.py
```
从另一终端测试:
```
finger anyone@localhost
```
服务器将忽略发送的任何用户名,始终返回你的plan。
若需重启后保持运行,可封装为`systemd`服务。
任何改进都由你决定。
## 最终说明
今日Finger仍活跃且持续修补。现代实现不会暴露主目录、不使用`gets()`函数并隔离进程。Morris蠕虫之恶源于1988年特定实现的漏洞,而非架构缺陷。它简洁、实用且安全。更重要的是,它让你成为网络存在的真正主人。
诚然,如今有更完善、更易用或基于其他协议的替代方案:
| 替代方案 | 编写内容 | 传输协议 | 阅读方式 |
|-----------------|---------------------------|-------------------|-------------------------------|
| **Finger** | `.plan`文件 | Finger (端口79) | `finger user@host` |
| **Org Social** | `social.org`条目 | HTTP | Org Social客户端或`curl`+`grep` |
| **RSS / Atom** | XML订阅源(从Markdown生成)| HTTP | 任何订阅阅读器 |
| **Gemlog** | gemtext格式的`.gmi`页面 | Gemini (端口1965) | Gemini客户端(Lagrange、Elpher)|
| **Phlog** | 文本文件与`gophermap` | Gopher (端口70) | Gopher客户端或`curl gopher://`|
| **`/now`页面** | 文本或HTML页面 | HTTP | 浏览器 |
相似文章
FidoNet:技术、用途、工具与历史(1993)
FidoNet 的技术概述,这是一种使用调制解调器的存储转发电子邮件广域网,于1984年开发,全球拥有超过20,000个节点。
Show HN: Freenet,一个面向去中心化应用的点对点平台
Freenet 是一个点对点平台,用于构建无需服务器运行的去中心化应用,它采用按环上位置组织的小世界网络。开发者可以使用 Rust 和 TypeScript 等熟悉工具部署应用,用户则通过浏览器访问,无需担心被追踪或被下架风险。
我们曾经拥有的(互联网XMPP全盛时期)(2023)
一篇回顾性的博客文章,感叹XMPP(Jabber)从2008年左右的全盛时期(当时被广泛使用并得到Google和Facebook等主要平台的支持)走向衰落,并与Matrix等现代去中心化替代方案进行对比。作者反思了XMPP如何曾经通过Pidgin和Trillian等客户端为主流用户所用,但后来被专有的围墙花园式消息应用所取代。
Show HN: Pieces – 面向大众的社交网络
Pieces 是一个全新的社交网络,拥有专属网页版和移动端应用,由一位在 Hacker News 上首次发帖的用户构建。
FOSS NotebookLM 连接到 Reddit、YT、Google、IG、Tiktok 等平台
SurfSense 是一个面向 AI 智能体的开源竞争情报平台,提供实时抓取连接器,支持 Reddit、YouTube、Instagram、TikTok、Google Maps、Google 搜索等,并配有 REST API 和 MCP 服务器。