Finger:从未消亡的社交网络
Finger: Social network that never died

原始链接: https://en.andros.dev/blog/54572bc7/finger-the-1971-social-network-that-never-died/

Finger 创建于 1971 年,是互联网上最古老的协议之一。它最初由斯坦福大学开发,用于检查用户连接状态,后来演变成一个原始的社交网络,用户可以在其中托管纯文本的 `.plan` 或 `.project` 文件。这些文件是最初的微型博客,约翰·卡马克(John Carmack)等开发者曾用它们来分享状态更新和项目日志,因而广为人知。 Finger 非常简单:它通过 TCP 79 端口使用未经加密的纯文本连接。虽然它在 20 世纪 90 年代末因安全漏洞(最著名的是被莫里斯蠕虫利用)而逐渐衰落,但如今它仍预装在大多数 Unix 和 Windows 系统中。 尽管年代久远,Finger 正在“小型网络”(small web)社区中经历小众复兴。现代实现通过隔离进程和避免泄露敏感用户数据来优先保障安全。如今,爱好者们将其作为一种极简、去中心化且极具个人特色的内容发布方式。它提醒着人们:简单且功能性的协议难以磨灭,同时也为现代互联网算法主导的社交媒体环境提供了一种令人耳目一新的宁静选择。

这段 Hacker News 讨论帖探讨了经典的 Unix 工具“Finger”,它常被人们视为最早的社交网络。 用户们回忆起该服务在 20 世纪 90 年代的作用,特别是在游戏开发社区中。在现代社交媒体出现之前,开发者会利用 Finger 的 `.plan` 文件功能,直接发布关于工作的“一手”更新。一位评论者提到,他们甚至编写了自动化的“轮询器”来汇集这些更新,并将其整合到 PlanetQuake 等门户网站上,这实际上创建了最早的行业特定新闻订阅流。 讨论强调了该协议的简洁性及其作为 Twitter 等平台早期前身的地位,参与者认为现代的文本类服务可以轻松复刻其效用。归根结底,这个讨论帖是一次对怀旧的回望,记录了一个简单的命令行工具如何成为实时数字交流的基础平台。
相关文章

原文

It will surprise more than a few of you to hear that the first social network dates back to 1971.

No accounts, no algorithm, no central server. Your entire profile fits in a single plain text file that you control. John Carmack (co-founder of id Software and programmer of Doom and Quake) used it as a development journal. And chances are you already have a client installed on your operating system without knowing it.

But the most incredible part is that, half a century later, it still works. And do not rule out a comeback.

Its name is Finger, and you can try it right now.

The finger client comes preinstalled on macOS and most Unix systems. On Debian or Ubuntu you install it with apt install finger. Windows also ships its finger.exe. And if you live in Emacs, you have M-x finger, included in net-utils.el out of the box.

finger [email protected]

It will randomly show you a Finger account hosted on happynetbox.com, one of the many directories (or hosts) that make publishing easy if you do not have your own server. Fun, isn't it?

But its origin is just as interesting.

Origin

In 1971, at the Stanford Artificial Intelligence Laboratory (SAIL), researchers shared a computer running the WAITS time-sharing system. The only way to know who was connected was the WHO command, which spat out an endless, hard-to-read list.

Well, Les Earnest, one of the lab's engineers, kept seeing a scene that repeated daily.

I frequently saw people running their fingers down the WHO display saying things like "There's Don and that's Pattie but I don't know when Tom was last seen."

People ran their fingers down the screen, hence the name. Earnest wrote a program that returned that information in a human format: real names, locations and, most importantly, how long each terminal had been idle. He was a practical engineer who preferred talking in person to talking through the computer. He wanted to know whether it was worth getting up and walking down the hall to find someone.

As a side effect, he had invented network presence, or the social network.

In 1977 the protocol was formalized in RFC 742, written by Ken Harrenstien. It was so primitive that only 3 sites supported it: SAIL, SRI and MIT's ITS machines. A little later, the networked implementation was handled by Earl Killian at MIT and Brian Harvey at Stanford.

In 1991, RFC 1288 was written, the definitive specification, making the earlier versions obsolete.

The first microblog: the .plan and .project files

On top of the protocol, there was content. Besides telling whether you were connected, Finger showed the contents of two text files in your home folder: .plan and .project. The original idea was to announce what you were working on and what you planned to do. A kind of static professional "status", with no interactions like likes or comments. As if it were a changelog of your day-to-day or your project.

People did what we always do: humanize it. They started including poems, jokes, personal diaries, ASCII art, articles... anything! Anyone in the world could read your .plan with a simple finger your-user@your-host. Many consider it, rightly, the first microblog on the internet.

As I mentioned, the most famous example is John Carmack's .plan. For years, any fan could type finger [email protected] (dead nowadays) and read, straight from the source, what the graphics engine of their favorite games was up to. He wrote from 1996 to 2010. Today they are preserved, archived on GitHub. It is one of the most valuable technical documents in video game history, and it was distributed over a 1971 protocol. TOO ANGRY TO DIE!

Do not expect prose that brings tears to your eyes, either. His style was telegraphic: task lists and bugs without a word to spare. But every so often a bombshell dropped. For example, on August 18, 1997 he announced through his .plan, not through a website or a press conference, that he planned to release the Doom source code:

-----------------------------------------
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.

Glory kill!

The first IoT device spoke Finger

Around 1982, some students at Carnegie Mellon University (Mike Kazar, David Nichols, John Zsarnay and Ivor Durham) got tired of walking down to the department's Coca-Cola machine and finding it empty or with warm bottles. They installed microswitches to detect how many bottles were in each column and how long they had been cooling.

They wired it all up to the network and exposed the status over Finger. From any computer you could run finger [email protected] (the machine's exact name changed over the years) and learn not only whether there were sodas, but which button would give you the coldest one. It is considered one of the first connected objects in history, the grandfather of the Internet of Things. And its interface was, once again, Finger.

The protocol

Finger is so simple it can be explained in one paragraph. The client opens a TCP connection to port 79 on the server. It sends a line of text (the username it is looking for, or an empty line to list everyone) terminated by a carriage return and line feed. The server responds with plain text and closes the connection. That's it!

No encryption, no headers, no sessions. Pure simplicity.

sequenceDiagram
    participant C as Client (finger)
    participant S as Server (fingerd, port 79)
    C->>S: Opens TCP connection to port 79
    C->>S: "johnc" + CRLF
    S->>C: Contents of ~johnc/.plan (plain text)
    S->>C: Closes the connection

The basic command is this:

finger user@server

Since the protocol has no secrets, you can speak it by hand with netcat. We send the username via standard input to port 79 and read what comes back:

echo "random" | nc happynetbox.com 79

It will feel familiar because it works like other protocols such as Whois, Gopher or SMTP: connect, ask in plain text, and read the response.

What goes inside a .plan

A .plan is not a wall of posts. It is a single text file where you can write whatever you want. When someone fingers you, the server returns the whole file, as-is. There is no format to follow, it is the wild west.

Does that mean you can only have one post? No. The custom, since the 80s, is to keep a sort of diary inside that same file, adding dated entries, usually with the most recent on top. That is how John Carmack published years of development. His .plan was a file that grew with entries separated by dashed lines:

-----------------------------------------
John Carmack's .plan for Jan 02, 1998
-----------------------------------------

Wired magazine does something that almost no other print magazine...

Yours could look simpler, with a profile header and several entries:

Emily Carter
Marine biologist. Coffee, kayaking and old maps.

--- 2026-08-14 ---
Back from sampling on the coast. Three jars full of plankton to go through.

--- 2026-08-05 ---
Finally finished "Dune". Now I get half the memes on the internet.

--- 2026-07-30 ---
Anyone know how to fix a bike chain that keeps slipping off? Tips welcome.

When the file gets long, you trim the old entries yourself. There is no database behind it storing your history: the .plan is mutable and unversioned, whatever you delete is gone. There is no way to "click" from one profile to another. Everything is manual.

To map it to what you already know:

Mastodon / X / Reddit Finger (.plan)
Publishing A new post per idea You edit a single text file
Multiple entries Automatic, each post is a row Manual: dated entries in the same file
History Everything is kept, with a permalink Only what you leave in the file, no permalink
Following someone Follow button and unified feed You finger them by hand, or a client gathers several
Replies and threads Yes Not natively
Likes and notifications Yes No
Structured profile Yes No
Navigating between profiles Links and mentions No
Discovering people Algorithm and trends Word of mouth and community lists

It looks a bit decaf next to today's social networks. Modern services smooth out some rough edges, as you will see below. But this is not a feature race, it is just your file with your status.

Its decline and resurrection

Finger did not fall into oblivion because of fashion, it fell because of security.

On November 2, 1988 came the Morris worm, one of the first worms to spread across the internet. One of its vectors was a flaw in the fingerd daemon. The worm sent a request that overflowed the buffer and managed to run code on the remote machine. It was, probably, the first malicious buffer overflow in history. It infected around 6,000 computers, roughly 10% of the entire internet at the time!

On top of that there was a deeper design problem. Finger reveals information about people: names, emails, schedules and when they last logged in. RFC 1288 itself carries a warning:

Warning!! Finger discloses information about users; moreover, such information may be considered sensitive.

By the late 90s, the vast majority of administrators had disabled the service. The protocol became a relic after almost 20 years of use, which is not bad at all.

And here comes the unexpected twist. Finger is so forgotten, and at the same time so present, that in 2020 it was discovered that certain attackers were using the finger.exe that ships by default in Windows to download malware without raising suspicion. It is a technique called living-off-the-land: the binary is already there, it is trusted, and almost nobody watches it. The Astaroth malware used it to fetch its payload. That a 1970s protocol still ships on every Windows says a lot about its design.

Simple, functional ideas are very hard to kill. Just look at how many Unix commands there are, many of them written before you were born. And with the revival of the small web, a current of minimalist, decentralized protocols (Gemini, IRC, RSS, NNTP, etc.), Finger has poked its head out again:

  • Happy Net Box, by Ben Brown. A reincarnation of the .plan with a web interface to edit your text and a daemon that limits the security risk. Try finger [email protected], or finger [email protected] (my earlier example) to read a random user.
  • Finger.Farm, by Jon Roig. Another open source Finger implementation written in Node, with updates via web, REST API or cURL, designed for you to self-host.
  • plan.cat, another public server that also bridges to ActivityPub, so your .plan can be read from Mastodon.

It is a living protocol, small and hackable, kept alive by people who find it fun.

There are even directories of active accounts:

finger [email protected]

And I am sure there are more communities I do not know about.

Taking your first steps

Easy: a host like Happy Net Box

You set up nothing. You sign up for free at happynetbox.com, write your text in its web box and save. From that moment on, anyone in the world can read you:

finger [email protected]

The service provides the server and the security. It is the perfect way to have your public .plan in a minute, without touching a console. Zero cost. If you come from Mastodon or X, this is your equivalent of "creating an account".

Intermediate: the Finger daemon on your Linux

If you already have a server (a VPS, a Raspberry Pi), you can run the classic daemon, the good old fingerd. It reads the ~/.plan file of whichever user is being queried and serves it. On Debian it is best to use ffingerd, a security-minded reimplementation and the recommended one for a public service. It is launched from a super-server like inetd, which listens on port 79 and starts the daemon on each connection.

sudo apt install openbsd-inetd ffingerd

Add this line to /etc/inetd.conf and reload the service:

finger stream tcp nowait nobody /usr/sbin/tcpd /usr/sbin/ffingerd
sudo systemctl reload openbsd-inetd

Now create your plan, world-readable, and test it:

echo "Hi, I'm Bob. Today I'm working on my Finger server." > ~/.plan
chmod a+r ~/.plan
finger your-user@your-server

All that is left is to open port 79 in the firewall and point a domain at it. Since Finger reveals information, follow the advice in Debian's security manual: use ffingerd, restrict which hosts can connect, and limit the number of processes.

Hard: your own fingerd in Python

If you want full control and to understand the protocol from the inside, write your own server. Since Finger is plain text over a socket, it fits in a few lines. This is the script I use to serve my .plan.

Create a file called fingerd.py with this content:

import asyncio

PLAN_FILE = "plan.txt"


async def handle(reader, writer):
    # Read the client's query and discard it: we serve a single 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())

Create a plan.txt with whatever you want to publish and start it.

Port 79 is privileged, so it needs permissions:

sudo python3 fingerd.py

Test it from another terminal:

finger anyone@localhost

The server ignores whatever name you send and returns your plan.

To survive reboots, wrap it in a systemd service.

Any improvement you want to add is up to you.

Final notes

Today it is still alive and patched. Modern implementations do not expose the home folder, do not use gets() and isolate the process. The ghost of the Morris worm was a flaw in a specific implementation in 1988, not in the architecture. It is simple, practical and secure. And, on top of that, it makes you the owner of your presence on the network.

That said, today there are more complete solutions, more accessible or riding on other protocols:

Alternative You write Travels over You read with
Finger A .plan file Finger (port 79) finger user@host
Org Social Entries in social.org HTTP Org Social client, or curl + grep
RSS / Atom An XML feed, generated from your Markdown HTTP Any feed reader
Gemlog .gmi pages in gemtext Gemini (port 1965) Gemini client (Lagrange, Elpher)
Phlog Text files and a gophermap Gopher (port 70) Gopher client, or curl gopher://
/now page A text or HTML page HTTP A browser, or curl

If you come from a mainstream social network, RSS is the gentlest gateway: you write on your blog and anyone follows you from their reader. The gemlog of Gemini and the phlog of Gopher are cousins of the small web, with their own clients and the same taste for calm. The /now page (the movement Derek Sivers started in 2015 and cataloged at nownownow.com) is, in practice, the .plan moved to the web: a single page that answers "what are you up to now?". And Org Social is almost Finger from birth: a microblog in a text file you host yourself.

That extreme minimalism, with no rules or defined formats, is exactly what makes it hard to kill and truly enjoyable.

It will not go mainstream again, and who cares? It will live on in the margins of an ever more complex internet, kept alive by the curious, waiting for someone to type finger and rediscover its easter egg. It is probably the smallest and the most yours thing you will have on the internet.

By the way, run finger [email protected] and keep an eye on my .plan. ;)

Sources

Every fact in this article comes from these references:

联系我们 contact @ memedata.com