1 分•作者: heroncoder•大约 1 个月前
大家好,我开发了 Hostflip,一个原生的 macOS 菜单栏应用,用于切换 `/etc/hosts` 文件配置。它免费且根据 MIT 协议开源。
我想要解决的问题不仅仅是编辑 hosts 条目。而是如何在不让一个写入者默默擦除另一个写入者的更改的情况下,与 Docker Desktop、VPN 客户端、脚本和手动编辑共享 `/etc/hosts` 文件。
首次运行时,Hostflip 会从现有文件捕获一个只读基线(称为“Base Hosts”),并将未修改的原始文件保留为 `hosts.orig`。活动配置会以一个清晰标记的块的形式附加在基线之后。
底层写入操作仍然是原子的全文件替换。在每次写入之前,守护进程会计算当前文件的哈希值并与预期的哈希值进行比较。如果不同,它会拒绝写入;应用程序会显示差异并要求用户先协调更改。
其他一些细节:
* 配置可以分组。每个组最多只能激活一个配置,而不同组的活动配置和独立配置会堆叠在一起。
* 在系统设置中一次性批准后,后续切换将不再提示输入密码。Root 助手通过 SMAppService 注册,并公开一个单一的 XPC 操作:以原子方式用合并的内容替换 hosts 文件。应用程序和守护进程会互相验证签名身份。
* 捆绑的 CLI 与应用程序共享同一个工作区,并支持结构化的 JSON 输出。`hostflip doctor dev.example.com` 会追踪一个主机名,从配置到合并的输出,再到当前的 `/etc/hosts` 文件,最后到系统解析器。
* 远程配置可以按计划从 HTTPS 源刷新。还有一个用于现有 SwitchHosts 配置的导入器。
* 编辑器支持跨配置主机名/IP 搜索、注释切换、对格式错误的 hosts 行进行基本验证,并且在处理大型远程配置时保持响应。
该应用程序使用 Swift 和 SwiftUI 构建,通过 Homebrew 或签名的公证 DMG 分发,目前需要 macOS 14 或更高版本以及 Apple Silicon。不支持 Intel、Windows 和 Linux。
我特别希望得到关于保守漂移行为的反馈:如果另一个进程更改了 `/etc/hosts`,Hostflip 会阻止对系统文件的进一步写入,直到用户审查差异。你们是如何处理 hosts 文件多重写入的,你们是否期望不同的协调模型?