用了好几年原生 zsh,.zshrc 越写越长,alias 和 lazy-load 函数堆了一百多行。终于某天觉得,行吧,试试 oh-my-zsh。
GitHub 上 186K star,装的人多了去了。官方文档给的安装方式是这样的:
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"下载一个脚本直接执行。我习惯性地想先看看里面写了什么——结果这一看就停不下来了。
先审后装
把 install.sh 拉下来读了一遍,大部分逻辑是正常的:clone 仓库、备份旧 .zshrc、可选换默认 shell。但有一行 eval echo ~$USER 在 $HOME 未设置时做 fallback,容器环境里 $USER 可能被注入,存在命令注入风险。桌面环境无所谓,但代码洁癖看着不舒服。
既然都看了,干脆把安装后每次 shell 启动实际执行的代码也审一遍。开了五个并行 agent 分别看:
- oh-my-zsh.sh(主加载器)——
$ZSH_THEME和$plugins没做路径校验,$ZSH_CUSTOM/*.zsh盲目 source。核心库代码质量不错,有 prompt injection 防护。 - 自动更新机制——
git pull --rebase拉代码,没有 GPG 签名验证。remote 和 branch 从本地 git config 读,理论上被篡改后可以指向恶意仓库。 - 核心库
lib/*.zsh——cli.zsh里有些 AWK 拼接没转义,但利用条件苛刻。整体写得挺规矩。 - 高风险插件——
dotenv是个大雷,cd进目录自动 source.env文件当 zsh 脚本执行,2016 年就有 RCE 报告。transfer和sprunge会往第三方服务器上传数据,sprunge 甚至走明文 HTTP。
结论:核心没大问题,风险在插件生态和无签名的更新链。知道雷在哪就行了,装。
安装
不用 curl-pipe-sh,下载后执行:
curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh -o install.shsh install.sh --unattended旧 .zshrc 自动备份到了 ~/.zshrc.pre-oh-my-zsh,把里面的 API key、alias、lazy-load 函数、PATH 配置全部合并到新 .zshrc 里。
加固
三件事:
# 不自动更新,只提醒zstyle ':omz:update' mode reminder
# 只启用安全的插件plugins=(git)# 收紧 custom 目录权限chmod 700 ~/.oh-my-zsh/custom黑名单插件:dotenv、autoenv、transfer、sprunge,永远不启用。
选主题
omz 内置 144 个主题。先试了 linuxonly,多行提示符显示用户、tty、路径和退出码,信息量很大但视觉上有点素。
换了 agnoster——Powerline 风格,需要 Nerd Font。自带的配色跟我终端背景不太搭,agnoster 支持环境变量覆盖颜色,在 source $ZSH/oh-my-zsh.sh 之前加:
AGNOSTER_CONTEXT_FG=whiteAGNOSTER_CONTEXT_BG=236 # 深灰AGNOSTER_DIR_FG=whiteAGNOSTER_DIR_BG=31 # 青蓝AGNOSTER_GIT_CLEAN_FG=blackAGNOSTER_GIT_CLEAN_BG=114 # 柔和绿AGNOSTER_GIT_DIRTY_FG=blackAGNOSTER_GIT_DIRTY_BG=214 # 橙色还搜了一圈第三方猫系主题,找到 Pawsh(ᓚᘏᗢ 猫脸提示符)和 Mau(猫字提示符),审了一下都是干净的单文件,没有网络请求和 eval。最后没用,但记一下以后想换可以试。
git 插件常用别名
装完默认启用的 git 插件提供了一堆别名,常用的几个:
| 别名 | 命令 |
|---|---|
gst | git status |
ga | git add |
gcmsg | git commit -m |
gp | git push |
gl | git pull |
gco | git checkout |
gd | git diff |
glog | git log --oneline --decorate --graph |
完整列表跑 alias | grep git。
omz 管理命令
omz plugin list # 列出 357 个可用插件omz plugin enable <name> # 启用插件omz plugin info <name> # 看插件说明omz theme set <name> # 换主题omz update # 手动更新omz reload # 重载配置用了几天感受:git alias 确实方便,prompt 比之前好看,插件按需加就行。早该装了。