812 字
4 分钟
终于装了 Oh My Zsh

用了好几年原生 zsh,.zshrc 越写越长,alias 和 lazy-load 函数堆了一百多行。终于某天觉得,行吧,试试 oh-my-zsh。

GitHub 上 186K star,装的人多了去了。官方文档给的安装方式是这样的:

Terminal window
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 报告transfersprunge 会往第三方服务器上传数据,sprunge 甚至走明文 HTTP。

结论:核心没大问题,风险在插件生态和无签名的更新链。知道雷在哪就行了,装。

安装#

不用 curl-pipe-sh,下载后执行:

Terminal window
curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh -o install.sh
sh install.sh --unattended

.zshrc 自动备份到了 ~/.zshrc.pre-oh-my-zsh,把里面的 API key、alias、lazy-load 函数、PATH 配置全部合并到新 .zshrc 里。

加固#

三件事:

~/.zshrc
# 不自动更新,只提醒
zstyle ':omz:update' mode reminder
# 只启用安全的插件
plugins=(git)
Terminal window
# 收紧 custom 目录权限
chmod 700 ~/.oh-my-zsh/custom

黑名单插件:dotenvautoenvtransfersprunge,永远不启用。

选主题#

omz 内置 144 个主题。先试了 linuxonly,多行提示符显示用户、tty、路径和退出码,信息量很大但视觉上有点素。

换了 agnoster——Powerline 风格,需要 Nerd Font。自带的配色跟我终端背景不太搭,agnoster 支持环境变量覆盖颜色,在 source $ZSH/oh-my-zsh.sh 之前加:

~/.zshrc
AGNOSTER_CONTEXT_FG=white
AGNOSTER_CONTEXT_BG=236 # 深灰
AGNOSTER_DIR_FG=white
AGNOSTER_DIR_BG=31 # 青蓝
AGNOSTER_GIT_CLEAN_FG=black
AGNOSTER_GIT_CLEAN_BG=114 # 柔和绿
AGNOSTER_GIT_DIRTY_FG=black
AGNOSTER_GIT_DIRTY_BG=214 # 橙色

还搜了一圈第三方猫系主题,找到 Pawsh(ᓚᘏᗢ 猫脸提示符)和 Mau(猫字提示符),审了一下都是干净的单文件,没有网络请求和 eval。最后没用,但记一下以后想换可以试。

git 插件常用别名#

装完默认启用的 git 插件提供了一堆别名,常用的几个:

别名命令
gstgit status
gagit add
gcmsggit commit -m
gpgit push
glgit pull
gcogit checkout
gdgit diff
gloggit log --oneline --decorate --graph

完整列表跑 alias | grep git

omz 管理命令#

Terminal window
omz plugin list # 列出 357 个可用插件
omz plugin enable <name> # 启用插件
omz plugin info <name> # 看插件说明
omz theme set <name> # 换主题
omz update # 手动更新
omz reload # 重载配置

用了几天感受:git alias 确实方便,prompt 比之前好看,插件按需加就行。早该装了。

终于装了 Oh My Zsh
https://blog.lishuyu.top/posts/终于装了oh-my-zsh/
作者
猫猫魔女
发布于
2026-04-07
许可协议
CC BY-NC-SA 4.0