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