用一杯咖啡的时间,把 SSH 管理这件小事做到极致

“为什么别人的终端永远比你快半拍?”——答案往往藏在看不见的细节里。


一、SSH 管理到底在折腾什么?

1.1 先弄清三个日常场景

场景 当前做法 痛点
刚入职,领导甩来 30 台服务器账号 一条条往 ~/.ssh/config 里手抄 抄错一个字母,连不上还得重来
凌晨两点紧急修 bug 在终端里 grep 半天找主机名 眼皮打架,手抖把生产连成测试
团队共享堡垒机 把 ProxyJump 参数记在记事本 每次复制粘贴,格式还容易乱

一句话总结:SSH 配置一旦超过 10 行,人就很难靠记忆不出错。


二、SSHM 是什么?一句话说清

SSHM 是一个用 Go 写的命令行小工具,只做一件事:
把你的 ~/.ssh/config 变成一张可搜索、可排序、可交互的“主机名片夹”

  • 不写一行配置就能用
  • 不改现有 SSH 习惯
  • 支持 Linux、macOS、Windows

三、三分钟完成安装

3.1 Linux / macOS:一条命令

curl -sSL https://raw.githubusercontent.com/Gu1llaum-3/sshm/main/install/unix.sh | bash

脚本做的事:

  1. 自动识别 CPU 架构
  2. 下载对应二进制
  3. 放到 /usr/local/bin 并赋可执行权限

3.2 Windows:一行 PowerShell

irm https://raw.githubusercontent.com/Gu1llaum-3/sshm/main/install/windows.ps1 | iex

装完后在任意目录输入 sshm,出现界面即成功。


四、第一次启动:零配置也能用

打开终端,敲:

sshm

你会看到类似下面的界面(示例):

┌─SSH Hosts────────────────────┐
│ web-prod-01                  │
│ db-dev                       │
│ backend-prod                 │
└──────────────────────────────┘

如果你的 ~/.ssh/config 已经有主机,它们会自动出现;如果没有,SSHM 会提示你添加第一台。


五、核心操作图解

5.1 新增主机(Add)

  1. a
  2. 填写表单(回车跳下一项)

    • Hostname/IP
    • User
    • Port(默认 22)
    • IdentityFile(私钥路径)
    • ProxyJump(可选)
    • Tags(逗号分隔,如 production,web
  3. Ctrl+s 保存,SSHM 自动写回 ~/.ssh/config

5.2 编辑主机(Edit)

  1. ↑↓ 选中主机
  2. e
  3. 修改任何字段
  4. Ctrl+s 保存

5.3 删除主机(Delete)

  1. 选中主机
  2. d
  3. 输入 yes 确认

5.4 连接主机(Connect)

  1. 选中主机
  2. 回车
  3. SSH 会话直接弹出,无需再输密码(如果你本机已配置密钥)

六、标签与搜索:当主机多到 100+ 台

6.1 标签示例

# Tags: production, web, frontend
Host web-prod-01
    HostName 192.168.1.10
    ...
  • 生产、测试、数据库、前端、后端……随你定义
  • 支持多标签,逗号分隔即可

6.2 搜索

  • / 进入搜索框
  • 输入 prod 立即过滤出所有含 “prod” 的主机
  • Tab 键切换“按名称”或“按最近登录”排序

七、命令行模式:脚本化场景

任务 命令 场景示例
非交互添加 sshm add api-prod CI/CD 里动态注入主机
指定配置 sshm -c /opt/ssh/config 多项目隔离配置
编辑特定主机 sshm edit jump-box 一键改跳板机端口

八、配置长什么样?一张图看懂

SSHM 不发明新格式,只在你现有 ~/.ssh/config 上加两行注释。

# Tags: production, web, frontend
Host web-prod-01
    HostName 192.168.1.10
    User deploy
    Port 22
    IdentityFile ~/.ssh/production_key
    Compression yes
    ServerAliveInterval 60
  • 第一行 # Tags: 是 SSHM 的额外元数据
  • 其余都是标准 SSH 语法,任何工具都能继续用

九、常见问题(FAQ)

Q1:我已经有 200 行旧配置,会不会被 SSHM 弄乱?
A:不会。SSHM 只在修改时自动备份为 ~/.ssh/config.bak,可随时回滚。

Q2:Windows 用户没有 ~/.ssh/config 怎么办?
A:SSHM 会自动在 %USERPROFILE%\.ssh\config 创建文件,无需手动建目录。

Q3:ProxyJump 填什么格式?
A:与原生 SSH 一致,如 user@bastion:2222

Q4:如何给同一台主机配多个密钥?
A:在“SSH Options”里填 -o IdentityFile=~/.ssh/key2,SSHM 会自动展开成多行。


十、进阶技巧:把 SSHM 塞进工作流

10.1 与 Ansible 联动

# 用 SSHM 搜到主机名,复制后直接
ansible-playbook -i web-prod-01, deploy.yml

10.2 与 tmux 分屏

# 一键开三台机
sshm  # 选中 web-01 → Ctrl+b+" → 垂直分屏
sshm  # 选中 web-02 → Ctrl+b+% → 水平分屏

10.3 在 CI 中自动添加主机

# GitHub Actions 片段
- name: Add staging host
  run: |
    sshm add staging \
      --hostname ${{ secrets.STAGE_IP }} \
      --user deploy \
      --identity-file ~/.ssh/stage_key

十一、源码快速走读(给好奇的你)

sshm/
├── cmd/           # 入口命令,用 Cobra 解析
├── internal/
│   ├── config/    # 解析你的 ~/.ssh/config
│   ├── ui/        # Bubble Tea 做的 TUI
│   └── history/   # 记录最后一次登录时间
  • 单文件二进制,无运行时依赖
  • 所有改动都会先写 .bak 再覆盖原文件,保证安全

十二、版本与下载地址

平台 文件名 一键下载
Linux x86_64 sshm-linux-amd64.tar.gz GitHub Latest
macOS Intel sshm-darwin-amd64.tar.gz GitHub Latest
Windows sshm-windows-amd64.zip GitHub Latest

十三、写在最后

SSHM 不打算替代你的 SSH 客户端,它只是帮你把“找主机”这一步缩短到 1 秒。
当你不再需要翻记事本、查 Wiki、问同事,就能把时间留给真正重要的事情——写代码、修 bug、陪家人。

祝你连接顺利。