一个 Hugo 构建阶段执行各种代码的小方法。

缘起

Life finds a way.
这句话用来形容 AI 沙箱权限逃逸,倒也挺合适的。最近我也遇到了一个类似的情况。

我在查阅文档的时候,偶然发现了 Hugo 有个配置项,是对二进制名单限制,还以为能执行任意二进制了。但查阅相关资料和尝试之后才发现,并不是那么一回事。那个名单是只能删,不能增的一个名单。或者说增加的可执行二进制文件,没有调用的方法。

不过我在向 Deepseek 提问的时候,AI 向我提供了一个方法,简单来说,就是搭建一个 RPC 服务,Hugo 的构建阶段使用 HTTP 请求。

这倒是一个我没想到方法,我之前的思路就是在 markdown 文件上进行操作,解析 markdown 文件,然后读取修改数据等。很繁琐,很灵活,拓展性很强。相对来说,这套 RPC 方案倒是很好上手。能玩出的花样也不少。

实现

服务端使用 Bun,提供 js 执行器。

加一个 render-codeblock-x.html ,将要执行的代码放在 markdown 的代码块里,然后构建阶段发送 HTTP 请求,获取 js 执行后的标准输出内容并处理。

下面这段代码实现了一个简单的 HTTP 请求发送器,使用了 Hugo 的缓存机制,避免重复执行相同的代码。并且使用 MD5 和时间戳击穿缓存。返回结果直接展示,没有什么额外的步骤。

js 执行器让 AI 写了两个版本

独立进程版本

复用进程版本

还可以搞成 VM 版本

总结

这个小玩意大概不会出现在我博客的构建流程中。但是不得不说,如果想实现花里胡哨的功能,这确实是一个方法。比如:

  • 服务端程序使用 NPM 各种包生成一堆 HTML 插入到 Hugo 中
  • 调用各种二进制文件处理点什么
  • 使用 AI 生成摘要,放在可以被 Hugo 使用的 data 文件夹。在构建阶段检测没有摘要就调用 AI 生成
  • 生成文章的高频词,自动生成标签,用于 RAG 的嵌入向量,文章推荐等等
  • 生成文章封面,程序自动修改文章封面 URL
Hugo 代码执行
https://www.ftls.xyz/posts/2026-07-01-hugo-exec/
Author 恐咖兵糖
Published at
Copyright CC BY-NC-SA 4.0