top of page

C-Kermit 在相隔 15 年后登上 Hacker News

8月13日
讀畢需時 15 分鐘

C-Kermit 在 15 年后迎来首次正式发布,使这个已有 45 年历史的通信系统登上了 Hacker News 首页。本次发布结束了自 2011 年 8 月 20 日发布 C-Kermit 9.0.302 以来的空档。

引人注目的并非某项重大的新功能,而是维护者在未放弃 Kermit 实用价值所在的平台支持与行为特性的前提下,将多年未完成的工作转化为正式发布。

这使两种软件维护方式形成了直接冲突。一种将旧代码视为应当替换的负担;另一种则保留经过验证的行为,同时针对当前编译器、库和安全预期进行精确修改。

Kermit 于 1981 年诞生于哥伦比亚大学,当时现代互联网、Linux,以及开发者如今所熟悉的标准化 C 语言都尚未出现。它能够存续至今,为我们提供了一个难得的视角:当软件必须跨越硬件边界和人类世代时,可移植性究竟意味着什么。

本次发布填补了始于 2011 年的空档

这次新发布将一条长期运行的开发分支转化为明确的里程碑,用户和操作系统维护者终于可以据此进行判断。

John Goerzen 在庆祝 Kermit 首次成功传输文件 45 周年之际宣布了这一发布。他详尽的发布说明还介绍了接手并更新一个已有数十年历史的 C 代码库所需的工作。

上一个正式发布的 C-Kermit 版本为 9.0.302。Kermit Project 将其日期定为 2011 年 8 月 20 日,当时原始的哥伦比亚项目不久后便完成了向开源模式的过渡。

此后开发并未简单停止。Alpha 和 beta 构建版本累积了修复、可移植性调整和兼容性工作。C-Kermit 10 于 2022 年进入 beta 测试,随后推出了一系列覆盖 Unix、OpenVMS、Windows 和 OS/2 的构建版本。

这一差异很重要。一个项目可能包含多年有价值的提交,却仍缺少一个发行版维护者和用户能够识别的稳定节点。开发快照能够证明项目仍在活跃,但正式发布建立了共同基线。

官方的更新记录显示了版本之间累积的大量工作。许多变更涉及编译器行为、操作系统接口、OpenSSL 兼容性、终端处理、文件操作以及平台特定的构建问题。

C-Kermit 10 还重新整合了此前与 Kermit 95 相关的 Windows 分支所共享的代码。这个更广泛的软件家族提供终端仿真、串行和网络连接、脚本编写、字符集转换以及文件传输功能。

Kermit 文件传输专为两个可能存在巨大差异的端点之间的通信而设计。这些差异可能包括操作系统、字符集、文件约定、连接类型以及可用的计算资源。

首次 Kermit 传输发生于 1981 年 4 月 29 日。两个运行在 DECSYSTEM-20 上的 Kermit 程序通过由空调制解调器电缆连接的串行端口进行通信。

最初的问题十分实际。哥伦比亚大学的学生需要在中央大型机和配有软盘驱动器的微型计算机之间移动文件。这些机器未必使用兼容的存储介质、字符编码或通信约定。

C-Kermit 后来在这一基础上发展为可编程通信应用。它可以通过串行连接、调制解调器、Telnet、Secure Shell 以及特定构建版本支持的其他传输方式管理会话和传输。

因此,C-Kermit 10 的发布并不只是一个重新活跃的文件传输工具。它为处于现代系统与组织无法随意更换的设备之间的软件建立了一个受维护的检查点。

此次发布也改变了项目的社会结构。一个与原作者高度关联的代码库,如今必须通过公开代码仓库、下游维护者、错误报告,以及拥有不同平台访问条件的贡献者来运作。

这种转变有助于解释 Hacker News 的关注。这个故事结合了计算史与一个活跃的维护问题:当几乎所有周边层面都已改变时,如何保留既有行为。

为什么 Hacker News 认为一个维护故事引人入胜

Hacker News 的反响反映出开发者更广泛的担忧:即使原有的开发文化已经消失,软件仍可能在运营上至关重要。

根据所提供的首页记录,该投稿获得了 118 分和 33 条评论。它的讨论帖成为个人回忆、技术问题和关于旧代码不同观点的汇集地。

一些读者记得 Kermit 曾是访问大学或企业计算机的日常组成部分。另一些人则通过串行控制台、嵌入式设备、复古计算,或类 Unix 操作系统中仍然可用的软件包了解它。

这种覆盖范围是 Kermit 长寿的核心。该软件并非仅作为博物馆展品存活。只要现代机器仍需通过保守的接口与旧系统或受限设备通信,它就依然具有现实意义。

网络管理员可能会遇到可靠管理路径仅为串行端口的设备。保存项目可能需要与早于当前网络服务的操作系统交换文件。工业运营者也可能拥有仍然有用、但无法运行现代代理程序的硬件。

替换这类系统并不总是软件决策。它可能需要新硬件、验证、采购、培训、停机时间,以及对物理基础设施的改造。因此,一个小型通信程序可能保留了对某项资产的访问,而该资产远比运行它的计算机昂贵。

Kermit 的吸引力还来自它对不完美链路的明确处理。现代开发者往往假定存在可靠的字节流、兼容的文件名,以及对文本有一致理解的系统。Kermit 诞生于这些假设并不安全的时代。

其协议可以协商传输参数,并区分文本与二进制数据。实现可以处理字符编码、行尾、数据包大小、控制字符和链路质量。

这并不意味着 Kermit 是所有当前传输任务的首选工具。Secure Copy、SFTP、rsync、HTTPS 和专用部署系统主导着常规网络工作流。Kermit 的价值会在常规假设失效之处显现。

这构成了本次发布背后的主要张力。重写一个旧通信工具或许能带来更整洁的内部结构,但也可能丢弃在真实部署中积累的、晦涩的兼容性行为。

这些行为往往无法在现代测试实验室中得到充分体现。维护者可能并不拥有最初暴露特定错误的旧工作站、Unix 变体、编译器、调制解调器或串行控制器。

因此,保存工作部分依赖于分散在用户群体中的知识。在旧平台上进行测试的人,可以揭示当前 Linux 或 macOS 上无法看到的假设。下游软件包维护者则可以识别由新编译器或加密库引入的故障。

Hacker News 的受众理解这一模式,因为它影响的不只是复古计算。同样的问题也出现在数据库、语言运行时、网络库、构建系统和积累了数十年行为的文件格式中。

软件的长寿不如推出一个新框架那样光鲜。但它揭示了新项目可以暂时推迟面对的工程约束。兼容性、文档、发布纪律和继任安排,最终决定软件会成为基础设施还是废墟。

C-Kermit 10 的发布让这些看不见的工作变得可见。它向开发者提供了一个具体案例:维护需要历史研究、技术克制,以及在修改陌生代码前先理解它的意愿。

可移植性是 C-Kermit 难以替代的核心特性

C-Kermit 的决定性能力并不只是文件传输;而是在从未被设计为彼此兼容的系统之间实现一致通信。

官方的版本规格描述了对众多 Unix 变体、各代 OpenVMS、现代平台以及重新整合的 Windows 支持。即使无法重新测试每个历史目标,目标范围依然异常广泛。

C-Kermit 成形于开发者尚不能假定存在 POSIX、ANSI C、Unicode、TCP/IP 或统一文件系统模型的时代。它通过隔离平台差异,并为能力不兼容的系统添加条件行为而不断发展。

这有助于解释为何源代码在接受当前惯例训练的开发者看来会显得陌生。预处理器分支、自定义类型处理、兼容性定义和不寻常的构建目标可能看似杂乱。放在当时的语境中,它们编码了项目的产品承诺。

代码必须兼顾从当代 64 位系统到使用旧编译器和有限库的机器等各种环境。即使这些机器已经罕见,删除其相关路径也可能抹去难以重建的知识。

C-Kermit 也早于开发者如今所期待的软件包管理体验。它的构建系统围绕大量具名目标演化而来,每个目标代表一个具有特定编译器和库假设的平台或配置。

现代重写项目可能会从可移植性框架和覆盖标准云端运行器的持续集成开始。C-Kermit 则诞生于许多目标系统无法共享这些工具、甚至无法共享对 C 语言相同理解的时代。

最终形成的是一个为广泛存续能力而优化的代码库。这一目标不同于在某个当前平台上为概念简洁性进行优化。

项目历史记录了跨越数量惊人的机器和操作系统的实现。由于许多目标计算机缺乏合适的 C 环境,Kermit 程序曾以多种语言编写。

C-Kermit 最终成为面向 Unix 和其他系统的广泛、可脚本化实现。其命令能够打开连接、自动化交互、转换数据、管理文件和发起传输。

这一脚本层依然重要。仅有传输协议并不能完整解决连接设备、应对其提示信息、收集文件并处理错误的问题。C-Kermit 可以在一个受控会话中组合这些步骤。

以通过串行接口连接的一台实验室设备为例。操作员可能需要设置线路特性、等待提示信息、发送命令、捕获结果,并在确认完成后传输文件。

现代终端程序或许能够处理交互式会话。独立的传输工具可以移动文件。另一个脚本系统或许可以自动处理提示信息。C-Kermit 的设计目标,是在差异巨大的主机之间将这些功能整合在一起。

这种整合解释了为何直接替代十分困难。竞争工具可能在流行平台上胜过 C-Kermit 的个别功能,却无法覆盖那些不寻常的组合。

因此,此次发布并不意味着每位开发者都应采用 Kermit。它证明,一些软件类别的定义取决于兼容范围的边缘,而非中心地带的使用体验。

移除一个冷门平台可以简化维护,也可能切断通往一台仍在执行重要任务的机器的唯一实用途径。C-Kermit 迫使维护者明确权衡这一取舍。

真正的工作,是让旧版 C 在新工具链中继续生存

此次发布背后的核心机制是保守式现代化:为适应当前系统作出必要改动,同时保护围绕旧系统建立的行为。

C 常被描述为一种稳定的语言,但一个长期存续的 C 程序依赖的远不止语言语法。它还依赖编译器的解释方式、系统头文件、库、整数宽度、调用约定以及操作系统服务。

旧编译器接受的合法写法,可能在 Clang 下触发警告或错误。平台提供的函数可能被弃用。头文件也可能因特性宏不同而暴露不同的声明。

加密依赖又增加了一层复杂性。OpenSSL 已变更接口并弃用旧函数,而 C-Kermit 一直尝试同时支持历史环境和当前环境。

最简单的做法是要求使用最新工具链,并移除旧路径。但这会与 Kermit 存在的理由相冲突。它的用户可能恰恰需要那些普通现代化工作会放弃的系统。

因此,C-Kermit 10 的工作采取了小规模、局部化的调整。维护者必须判断:一条警告指出的是实际缺陷、可移植性隐患,还是仅仅是新工具链对有效旧代码施加的偏好。

这种判断无法完全自动化。编译器可以指出可疑代码,但无法解释哪些历史系统依赖特定的表示方式或控制路径。

静态分析也面临类似限制。它可以识别潜在的内存、类型或控制流问题,却无法自动知道看似冗余的分支是否是在补偿 30 年前的非标准库。

这正是维护旧代码与单纯转换其语法的区别所在。维护者必须先还原代码背后的推理,再决定哪些部分是技术债,哪些部分是兼容性保障。

文档也成为可执行系统的一部分。变更日志、注释、构建报告、发布说明、邮件列表消息和旧手册,都保存着无法从单条语句中看出的决策。

可搜索的技术档案让这项工作成为可能。它使维护者能够比较不同版本、定位历史源码,并确认某项行为何时进入程序。

据项目方介绍,该档案包含约 700 个不同的 Unix makefile 目标,以及约 1,700 个归档的 Unix C-Kermit 二进制文件。这些数字说明了兼容性承诺的规模,并不保证每个目标如今仍能构建。

旧构建产物依然能回答有价值的问题。它们揭示了平台名称、编译选项、模块边界,以及早期维护者认为重要的环境。

测试仍然至关重要,但老旧的可移植程序会形成棘手的测试矩阵。当前的持续集成服务只能覆盖 Kermit 历史平台中的一小部分。

社区构建报告填补了部分空白。能够访问 HP-UX、OpenVMS、较旧 BSD 系统或特殊架构的用户,可以测试维护者无法在本地复现的变更。

这一过程还要求克制地进行重构。大型结构性改动可能让代码更易读,却也可能以微妙方式改变时序、缓冲区行为、平台选择或条件编译。

对于通信程序而言,这些细节可能至关重要。错误可能只会在特定控制字符、终端模式、文件名、数据包序列或连接中断时出现。

因此,一次成功的 C-Kermit 10 发布,与其说体现了英雄式编程,不如说体现了受控变更。其成就在于:在推进构建和安全假设的同时,让既有用户仍能认出这个程序。

这对 C 之外的维护者也很有启发。现代化工作最适合从软件的实际契约开始,其中也包括用户所依赖的那些不便行为。

十五年的变更,也带来了十五年的风险

正式发布改善了项目的处境,但其历史和可移植性仍是未知因素,而非可靠性的自动证明。

长期存在的软件可能因为被用户广泛使用而稳定,也可能包含几乎未接受当代测试的路径。这两种情况可以同时存在于同一个程序中。

C-Kermit 覆盖的平台范围很广,使全面验证并不现实。在 Linux、macOS 或当前 BSD 系统上成功构建,并不能确认它在每种旧 Unix 或 OpenVMS 配置上都能正确运行。

项目已在其构建文档中承认这一限制。一些历史平台已难以通过常规方式获得,维护者因此无法直接验证它们。

自 2011 年以来,安全预期也发生了变化。网络客户端如今运行在一个由更高加密要求、对旧协议更低信任度,以及对远程控制行为更严格审查所塑造的环境中。

这一点尤其相关,因为 C-Kermit 能做的不只是复制文件。它包含网络客户端、脚本、终端功能和服务器模式,所有这些都扩大了需要审查的范围。

近期的 Debian 打包工作通过默认阻止对本地 Kermit 的远程控制,修复了编号为 CVE-2025-68920 的漏洞。这一修复说明,维护工作不仅必须关注编译器兼容性,也必须包含安全默认设置。

将新版发布视为每项功能和平台组合都已接受现代安全审计的证明,是错误的。现有证据仅支持一个更谨慎的结论:维护者已恢复发布纪律,并处理了已知问题。

用户仍应禁用不需要的协议和服务。他们还应检查 C-Kermit 在所选构建中如何存储凭据、调用外部程序、验证远程输入,以及协商加密连接。

发行版软件包又增加了一个变量。Debian、Ubuntu、Homebrew 和其他系统可能提供不同的发布版本、补丁、构建选项或更新节奏。

在这一事件前后,一些软件包目录仍将 9.0.302 标为稳定版 C-Kermit。新的上游版本不会自动传播到每个受支持的操作系统。

这种滞后在管理员依赖软件包级安全支持的场景中尤为重要。直接从上游安装可以获得更新的代码,但也可能绕过发行版的集成、补丁和更新机制。

项目的传承模式也是另一项不确定因素。Frank da Cruz 数十年来指导 Kermit 的开发,并保留了海量的平台知识。新维护者必须在这些知识成为永久瓶颈之前将其分散传承。

Goerzen 的参与令人鼓舞,因为他拥有 Debian 打包、旧网络系统以及 Kermit 本身的经验。然而,一个持久项目需要的不止一位知识渊博的继任者。

它还需要审查能力、可复现的发布流程、易于访问的问题跟踪系统、文档化的构建流程,以及愿意测试较少见系统的贡献者。

因此,对 Hacker News 的热情应被视为一个开端,而非一次已经完成的复兴。关注可以吸引测试者和贡献者,但在首页时刻过去后,也可能随之消散。

成功的维护交接将取决于兴趣能否转化为可重复开展的工作。错误报告、平台测试结果、代码审查和文档改进,比下载量的短暂上升更重要。

C-Kermit 不需要庞大的消费级用户群。它需要足够多的活跃参与者,以覆盖那些证明其继续存在合理性的专业环境。

C-Kermit 挑战了默认的重写论调

此次发布表明,替换旧软件并不必然比理解它更便宜、更安全或更清晰。

重写之所以仍具吸引力,是因为它让开发者能够选择当前的抽象、库、测试和构建系统。它们可以移除从不再重要的环境中继承下来的限制。

当所需行为已被理解且兼容性边界明确时,这种做法有效。C-Kermit 呈现的却是相反的条件。

它的行为反映了数十年来与机器、协议、字符集、终端和操作系统的交互。一些要求之所以存在,只是因为某个真实系统曾违反了更方便的假设。

重写团队首先需要识别这些假设。否则,他们可能产出一个更整洁的应用程序:它在常见测试中表现良好,却在 Kermit 专为处理的边缘场景中失败。

重写同样会带来验证问题。匹配可见的命令集,并不保证在中断传输、异常编码、控制字符处理或平台特定文件系统操作中具备等效行为。

现有源码既是实现,也是累积证据。即使笨拙的代码,只要维护者追溯其引入原因,也能记录某种故障模式。

这并不意味着旧代码永远不应被替换。有些兼容性分支已不再保护任何仍可访问的系统。有些接口带来不可接受的安全风险。有些设计让安全修改变得过于困难。

更好的问题不是代码看起来是否现代,而是维护者能否说明哪些行为必须保留、哪些行为可以改变,以及他们将如何发现回归。

C-Kermit 10 提供了一种渐进式答案:保留具有外部价值的系统,修复不兼容之处,改善默认设置,并创建一个供未来贡献者检视的发布版本。

未来仍可能出现并行实现。相比从被放弃的快照开始,它将受益于一个持续维护的参考实现和已文档化的行为。

这一区别在企业技术领域同样重要。许多组织运行的软件,按开发工具标准看已经陈旧,却与实体设备、受监管流程或不可替代的数据深度集成。

团队常常低估这些系统中蕴含的知识。源码可能包含针对供应商缺陷、历史格式、时序约束和当前文档中缺失的操作流程的变通方案。

重写可能会在任何人意识到之前抹去这些知识。维护则能将其保留足够久,以便记录、测试,并最终有意识地替换。

C-Kermit 还挑战了对创新的狭隘理解。支持当前编译器,同时保留访问旧机器的能力,并不会创造一个新类别。它延长了既有投资和信息的可用寿命。

这种结果可能比增加功能更有价值。它降低了这样的风险:一台正常工作的设备或一份档案,仅因某个桥接程序停止编译而变得无法访问。

此次发布在 Hacker News 上的出现,放大了这一论点。开发者的回应并不只出于怀旧,也源于许多团队都能理解、却很少公开讨论的维护难题。

三个信号将表明这场复兴能否持续

下一项考验是,此次发布能否形成可持续的维护循环,而非成为最终的历史标记。

第一个信号是下游采用情况。Debian、Ubuntu、Homebrew、BSD ports 及其他软件包系统将揭示维护者是否认为该版本已适合更广泛部署。

打包过程会暴露上游构建可能未能发现的问题。各发行版会采用更严格的编译器标志,拆分可选依赖项,在多种架构上进行测试,并要求升级行为可预测。

广泛采用将强化这样一种判断:C-Kermit 已经结束漫长的 beta 阶段,进入常规维护。长期延迟或大量下游补丁则表明集成工作仍未解决。

第二个信号是已验证构建的多样性。来自 OpenVMS、较旧 Unix 变体、当前 Linux 发行版、macOS 以及较少见架构的结果,将显示其可移植性承诺还有多少能够被验证。

即使一些非常古老的目标平台仍未得到验证,不断扩展的公开构建矩阵也会增强信心。若失败主要集中在旧版库或编译器假设上,则可帮助维护者界定切实可行的支持边界。

第三个信号是贡献者的持续性。该项目需要更多能够审查变更、理解协议行为、维护发布基础设施,并测试主流开发者环境之外系统的人。

新贡献者不必立即掌握整个代码库。文档修复、可复现测试、构建报告、警告清理和独立的 bug 修复,都能逐步分散知识。

如果工作通过公开 issue 和定期发布持续推进,该项目实现的就不只是一次性复苏,而是将个人式维护转化为可持续的开源流程。

如果活动重新回到零散补丁和无限期的开发快照,新版本依然具有意义。它将提供一个更整洁的保存节点,但继任问题仍将存在。

对于通过 hacker news 了解到这一故事的开发者,最有用的回应是采取实际行动。确认某个组织是否仍依赖 Kermit、串行工作流或未文档化的传输脚本。在了解这些系统的人离开之前,记录下关键的平台、构建选项和行为。

随后关注软件包更新、构建报告和贡献者活动。C-Kermit 已经挺过了 45 年和长达 15 年的发布空档。下一个里程碑,是证明它所承载的知识能够比任何单一维护者存续得更久。

 
 

免费开始使用

一款本地优先的AI助手

为了获得更好的人工智能体验,

remio 目前仅支持Windows 10+ (x64)和M-Chip Mac 。

你的 AI 工作伙伴

和 remio 一起高效工作

规划、创作、交付

一站式完成

bottom of page