visitor@wangyvdi.top:~$ cat posts/001_what_is_ssh_blog.md

什么是 ssh.blog

#介绍 #对比 #ssh 4 min

一个同时能被浏览器和终端阅读的博客。

文章只有一份 markdown,程序就是一个二进制文件加一棵目录树。网页那一侧是正常的站点(真实 URL、RSS、能被搜索收录);终端那一侧你可以 ssh 进去敲 ls、cat、grep,输出还能直接进管道。

而且网页的 URL 就是树里的路径:/posts/x.md 是那篇文章,/posts/ 是那个目录,/ui/theme.css 就是那个文件。没有第二套地址规则。

三个入口,一份内容

入口 怎么进 得到什么
网页 打开域名 可分享、可收录的文章页;首页是一个可交互的终端
浏览器终端 在首页直接敲命令 ls / cat / cd / grep / tree,Tab 补全、↑↓ 历史
SSH ssh 你的域名 同一个终端,而且输出是纯文本,能进管道和脚本

三个入口共用同一份命令实现:ls 在网页里和 SSH 里走的是同一个函数,只是输出分别渲染成 HTML 和 ANSI。所以不存在"两边行为不一致"这种事。

和其他方案比

方案 文章在哪里 阅读入口 运行时依赖 说明
WordPress / Ghost 数据库 网页 PHP 或 Node + 数据库 + 反代 功能最全,维护面也最大
Hugo / Jekyll / Zola markdown 网页 无(产物是静态文件) 快、稳、SEO 好,但只有网页
Astro / Next.js markdown 网页 构建链(Node + 一堆依赖) 灵活,代价是要维护前端工程
LiveTerm 一类模板 写在配置或前端里 网页 前端框架 终端是假装的:命令是前端函数,刷新就回初始状态,也没有 URL 和 SEO
ssh.blog markdown(一份) 网页 + 浏览器终端 + SSH 一个二进制 + 一棵目录树(无 Node、无数据库、无构建步骤) 终端是真的;命令能进管道;代价是受众面和功能面

别人不太有的几点

  1. SSH 是真终端,不是网页里假装的。 ssh 你的域名 真的连上;ssh 你的域名 cat 某篇 的输出能 | less、能 grep、能写进脚本。
  2. 一份内容,三个前端。 markdown 是唯一真相,网页用 goldmark 渲染,终端里就是原始文件(不做排版),而命令实现只有一套。
  3. URL 就是路径。 网页上没有另一套"文章 ID"或者路由表:目录给你目录页,.md 给你文章页,其它文件给你原文。新建一个目录、丢一篇 markdown 进去,网页和终端立刻都有,不用改代码、不用重启、不用重新构建。
  4. 一个二进制加一棵树,零运行时依赖。 服务器上放这个二进制和这份仓库就能跑:文章是树里的 markdown,终端里浏览的文件、source 读到的源码也都是这棵树本身。没有数据库、没有 Node、不发布文章也不用重新构建。
  5. 程序可以自省。 which 能看到每条命令实现在哪个文件哪一行,source ls 能直接把实现它的 Go 代码打印出来(读的就是服务器上那份源码);buildinfo / deps / ps / lsof 报的是现场数据,不是写死的。
  6. 没有 JavaScript 也能用。 首页是一个普通表单,命令由服务端执行;同时网页侧有真实 URL、canonical、RSS、sitemap——把"终端博客没 SEO"这个老问题补上了。
  7. 改样式只改你看到的那一份。 配色是几个 CSS 变量,theme / edit 由浏览器接管写进 localStorage,服务端一行都不动。

代价,先说清楚

  • 读者门槛:会敲 ssh 的人很少。SSH 入口是给同类人准备的彩蛋,不是主要渠道。
  • 移动端一般:终端排版在手机上只是"能用"。
  • 功能面窄:没有评论、没有 CMS、没有草稿流、没有多作者、没有插件生态。
  • 维护面全在自己身上:换主题、加功能都得自己写(好处是不会被插件升级搞坏)。
  • 终端是近似的:表格和图片只能用文本近似表达。
  • SEO 只来自网页那一侧:SSH 入口对搜索引擎不存在。

适合谁

适合:想要一个有点个性的个人站点、喜欢终端、愿意把"这东西怎么做的"也当成内容的人。

不适合:要开箱即用插件生态的、多人协作的内容平台、必须给不特定大众阅读的营销站。

想试一下

# 本地跑(启动日志会打印两个入口各自监听的地址)
go run .

进去之后,这几条最能说明它和别的博客不一样:

visitor@localhost:~$ help        # 全部命令
visitor@localhost:~$ which ls    # 每条命令实现在哪个文件哪一行
visitor@localhost:~$ source ls   # 直接把实现它的 Go 代码打印出来
visitor@localhost:~$ ps          # 这个进程自己的内存、goroutine、请求数
visitor@localhost:~$ deps        # 编进这个二进制的依赖表

如果这个站点就是一个 ssh.blog,上面这些命令你在网页首页也能敲——不用开终端。

在终端里读这篇:ssh -p 2022 wangyvdi.top cat posts/001_what_is_ssh_blog.md (原文 是同样的纯文本)