终端快捷命令

用两张配置表管住数据库和服务器的连接命令,短名直接可敲,密码不落明文。
环境

macOS + zsh 5.9 + Homebrew 的 mysql-client。Linux 上除了 UseKeychain(macOS 钥匙串专有)之外都能用。

shop-test 就连上测试库,敲 aliyun-01 就登服务器。

两张表怎么分

判据一句话:要不要拼参数、要不要存密码?

用哪张表例子
要拼参数、要存密码db/connections.confMySQL、Redis
命令现成,只是长shortcuts.confssh、端口转发、kubectl context

目录结构

sh
~/.zshrc                          # 只是个 loader,按序 source rc.d/*.zsh
~/.config/zsh/
├── rc.d/
│   ├── 00-path.zsh               # PATH
│   ├── 10-completion.zsh         # 补全系统
│   ├── 20-plugins.zsh            # autosuggestions / syntax-highlighting
│   ├── 30-prompt.zsh             # starship
│   ├── 40-aliases.zsh            # 通用别名 ll / la
│   ├── 50-db.zsh                 # 读注册表 → 生成连接别名 + db 命令
│   ├── 55-shortcuts.zsh          # 读快捷表 → 生成短名 + sc 命令
│   ├── 60-integrations.zsh       # 终端集成
│   └── 99-local.zsh              # 本机私有,gitignore
├── db/connections.conf           # 数据库注册表(无密码,可入库)
└── shortcuts.conf                # 短名 → 命令
~/.ssh/config + conf.d/*.conf     # 主机细节:IP / 密钥 / 跳板机
~/.mylogin.cnf                    # 密码,600,绝不入库

加一类配置就加一个分片文件,不往 .zshrc 里堆。~/.zshrc 全文就这几行:

zsh
export ZSH_CONFIG_DIR="${XDG_CONFIG_HOME:-$HOME/.config}/zsh"

for _rc in "$ZSH_CONFIG_DIR"/rc.d/*.zsh(N.on); do
    source "$_rc"
done
unset _rc

命令速查

sh
# 数据库
db ls                      # 列表,COMMAND 列就是能直接敲的命令
db show <name>             # 明细(不含密码)
db auth <name>             # 录入密码,交互输入
db forget <name>           # 删除本机密码
db q <name> "select 1"     # 跑一条 SQL,表格输出,不进交互
<name>                     # 直接连,等价于 db connect <name>

# 其他命令
sc ls                      # 列表 + 生效状态
sc show <短名>              # 看展开成什么
sc edit                    # 编辑快捷表
sc reload                  # 重载 shell

dbsc 都带 Tab 补全。

db ls 的样子:

text
NAME       COMMAND    HOST                     PORT  USER    DATABASE  ENV   AUTH
shop-test  shop-test  db-test.internal.example 3306  app_ro  app_test  test  ✔

AUTH 是本机有没有存密码。每个连接生成两个别名,shop-testmysql-shop-test,效果一样,后者方便 mysql- + Tab 找同类。

加一个数据库

三步。

1. 登记连接db edit 打开注册表,加一行:

ini
# name       engine  host                      port  user    database  env
shop-test    mysql   db-test.internal.example  3306  app_ro  app_test  test

字段之间空格分隔,database 不需要就填 -envprod 时连接前会要求输入 yes 二次确认,防手滑。

2. 录密码

sh
db auth shop-test

交互输入,存进 ~/.mylogin.cnf。这一步是 mysql_config_editor 干的,密码不会进注册表,所以注册表可以放心提交到 dotfiles。

3. 生效

sh
exec zsh

之后 shop-test 直接可用,额外参数会透传:

sh
shop-test -e "show tables"

加一个服务器或其他命令

两步。sc edit 加一行,第一个字段是短名,余下整行都是要执行的命令:

ini
# 服务器(主机细节写在 ~/.ssh/conf.d/ 里)
aliyun-01        ssh aliyun-01
aliyun-02        ssh aliyun-02

# 端口转发:本地 13306 通到测试库
tun-shop         ssh -N -L 13306:db-test.internal.example:3306 bastion

# k8s
k8s-test         kubectl --context=test

然后 sc reload。只支持整行注释,不支持行尾注释。

短名撞上已有命令时会被跳过并告警,不会覆盖系统命令。试过写一个叫 ls 的短名,结果是它被跳过,whence -w ls 仍然是 commandsc ls 里那行标成「冲突/未生效」。数据库那边同理,裸短名撞了就退回只能用 mysql-<name>

SSH 主机定义

~/.ssh/config 只留 Include 和全局默认,主机按用途拆到 conf.d/

sshconfig
Include conf.d/*.conf

Host *
    AddKeysToAgent yes
    UseKeychain yes
    ControlMaster auto
    ControlPath ~/.ssh/cm/%C
    ControlPersist 5m
    ServerAliveInterval 60
    IdentitiesOnly yes

conf.d/10-servers.conf

sshconfig
Host aliyun-01
    HostName 1.2.3.4
    User work
    IdentityFile ~/.ssh/id_ed25519

Host shop-test-*
    User work
    ProxyJump bastion
Include 必须放在最前面

ssh 是「首次取到的值生效」。Include 放到 Host * 后面的话,分片里的设置会被全局默认盖掉。

ControlPath 那个目录要自己建:mkdir -p ~/.ssh/cm && chmod 700 ~/.ssh/cm

顺带说下这几个全局默认的作用:ControlMaster 是连接复用,走跳板机时第二次连接秒开;IdentitiesOnly 让 ssh 只试配置里指定的密钥,密钥多了能避免 too many authentication failures。

zsh 5.9 的 _ssh_hosts 补全函数会展开 include,所以拆分之后 ssh + Tab 照样能列出所有 Host。

换机器怎么迁

能直接拷的:~/.config/zsh/ 整个目录、~/.ssh/conf.d/*.conf

不能拷的:~/.mylogin.cnf(每台机器重新 db auth)、~/.ssh/id_* 私钥、含内网 IP 的分片(用 90- 前缀 + gitignore 隔离)。

做成 dotfiles:

sh
mkdir -p ~/.dotfiles && cd ~/.dotfiles && git init
mv ~/.config/zsh zsh && ln -s ~/.dotfiles/zsh ~/.config/zsh
mv ~/.zshrc zshrc && ln -s ~/.dotfiles/zshrc ~/.zshrc

~/.ssh 不要整体入库,里面有私钥。

注意事项

  • 生成的是 alias,只在交互式 shell 生效。写 shell 脚本时要用完整命令。
  • ~/.mylogin.cnf 是混淆存储不是加密,MySQL 官方文档明确说它只防无意窥视。能读到 home 目录的人就能解出密码。
  • 改完两张表都要 exec zsh(或 sc reload)才生效,当前窗口不会自动重载。

附录:完整代码

rc.d/50-db.zsh

rc.d/55-shortcuts.zsh

新故事即将发生
Java 的 ACM 常用模板

评论区

评论加载中...