Watch at Ease看见世界,读懂生活。

科技 · 实用指南

zsh compinit 提示“不安全目录”?chmod 前先审计补全信任链

这条警告保护的是会加载 shell 代码的路径。修改权限或关闭检查前,先绑定真实用户、每个 fpath 父目录、符号链接目标与安装器所有者。

原创图示:zsh 补全信任链。
原创示意图:审计调用者、fpath 父目录、补全文件与真实目标。 Watch at Ease

zsh 会警告不安全的补全目录,因为 fpath 中的文件可能作为 shell 代码加载。它是信任边界,不是递归 chmod 或 chown 的指令。

以实际打开终端的用户运行 compaudit,沿每个路径检查父目录和真实链接目标,找出包管理器或安装器所有者,再做一次可回滚修复并验证。

1. 用真实 shell 用户重现审计

在出现警告的同一交互式 shell 中记录 zsh 版本、id、groups、HOME、ZDOTDIR 和有序 fpath,再运行 autoload -Uz compaudit 与 compaudit。

不要把 sudo、删除补全缓存或反复回答提示当成诊断,它们会改变调用者或缓存,却没有证明哪个路径可写。

2. 盘点每个路径、父目录与真实目标

对每个结果记录文件、相关父目录和符号链接真实目标的所有者、组、模式与 ACL,并与 fpath 顺序对照。

把每个写入者分类为当前用户、root、包管理器所有者、可信共享组或非预期账户,并保留变更前状态。

3. 区分三类所有权场景

用户目录中的意外漂移只修正已证明的所有者或写位;包管理目录应采用包管理器支持的所有者模型。

有意共享的前缀必须确认每位写入者都可被信任执行 shell 代码,否则移入每用户路径或保持排除。

4. 让修复可持续且可回滚

只在真实所有者权限范围内修改最小路径,记录旧值、新值、命令与回滚。禁止对未经审读的输出做 chmod -R、chown -R 或 xargs。

若更新会重新制造问题,应修复安装器、包配置或 FPATH,而不是每次升级后重复特权扫描。

5. 验证新 shell 与负向边界

以原用户启动新 shell,重跑 compaudit,并测试一个来自该路径的补全。结果应为空或仅含有意排除项。

再证明不可信账户无法修改任何已加载补全文件或父目录,并重放原升级流程。只有补全正常且代码边界仍关闭时才验收。

原创图示:zsh 补全持久修复矩阵。
原创示意图:把修复交给正确所有者,并在升级后重测。 Watch at Ease