Mac下使用Kitty终端快速通过SSH连接服务器

之前我一直使用 Tabby 作为终端工具,它内置了 SSH 服务器配置管理功能,通过快捷键就能调出交互界面,便捷地连接服务器。但它实在太占用内存了,而且界面经常卡顿。于是我决定切换到 kitty,这是一款由 C 语言和 Python 编写的终端模拟器,以高性能著称。

image-20260117154051790

然而切换到 kitty 后,我发现它并没有类似 Tabby 的 SSH 配置管理功能。经过一番折腾,最终实现了在 kitty 中也能像 Tabby 那样通过交互式界面快速连接服务器的效果。如上图所示,只需按下配置的快捷键,就会打开一个新的标签页,此时可以输入关键字搜索目标主机进行连接。

image-20260117150751362

1. 配置快捷键并实现主机搜索功能

这一功能的核心工具是 fzf,它是一个用于终端的交互式模糊搜索工具。fzf 可以快速搜索、过滤和选择文本内容,非常适合用来实现主机选择功能。

Mac 用户可以通过 Homebrew 安装:

1
brew install fzf

安装完成后,需要编写一个 Shell 脚本实现 SSH 连接逻辑。我们将这个脚本命名为 kitty-ssh,保存到 ~/.local/bin 目录下,并赋予执行权限:

注意:请确保 ~/.local/bin 目录已添加到你的 PATH 环境变量中,否则系统可能找不到该脚本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# ~/.local/bin/kitty-ssh
#!/usr/bin/env bash

# 第1行:使用 fzf 从 SSH 配置文件中读取所有主机名,通过模糊搜索让用户选择
# - grep '^Host ' 匹配以 "Host " 开头的行(SSH config 的主机名定义行)
# - awk '{print $2}' 提取每行的第二个字段(即主机名)
# - fzf 提供交互式选择界面
host=$(grep '^Host ' ~/.ssh/config | awk '{print $2}' | fzf)

# 第2行:如果用户没有选择任何主机(按下 Ctrl+C 或 Esc),则直接退出脚本
[ -z "$host" ] && exit 0

# 第3行:从 pass 密码管理器中获取该主机对应的密码
# pass ssh/server1 的格式对应我们在 pass 中存储的密码路径
# 2>/dev/null 静默处理密码库未初始化等情况
password=$(pass ssh/"$host" 2>/dev/null | head -n1)

# 第4-6行:如果 pass 中找到了密码,则使用 sshpass 自动输入密码连接
# 否则直接使用 ssh 命令连接(此时需要手动输入密码或使用 SSH 密钥)
if [ -z "$password" ]; then
ssh "$host"
else
# -e 选项让 sshpass 从环境变量 SSHPASS 读取密码
SSHPASS="$password" sshpass -e ssh "$host"
fi

设置可执行权限

1
chmod +x ~/.local/bin/kitty-ssh

依赖说明

  • sshpass:需要单独安装(brew install sshpass),用于自动填充 SSH 密码
  • pass:用于安全存储和管理服务器密码,详见下文配置
  • 如果选择不使用密码管理,也可以将脚本中的密码获取部分替换为直接连接

接下来配置 Kitty 的快捷键来执行这个脚本。我设置的是 cmd+shift+h,在 Kitty 的配置文件(通常位于 ~/.config/kitty/kitty.conf)中添加以下内容:

1
map cmd+shift+h launch --type=tab --hold --cwd=current fish -lc "kitty-ssh"

配置参数说明

  • map cmd+shift+h:定义快捷键为 Command+Shift+H
  • launch:启动一个新程序
  • --type=tab:在新标签页中打开(可选值:tabwindowoverlay 等)
  • --hold:命令执行完毕后保持标签页打开,不会自动关闭
  • --cwd=current:使用当前工作目录
  • fish -lc "kitty-ssh":使用 fish shell 执行 kitty-ssh 命令

Shell 说明:上述配置使用 fish shell,如果你在使用其他 shell(如 zsh 或 bash),请将 fish -lc 替换为 zsh -lcbash -lc。如果直接执行脚本(确保脚本有执行权限且在 PATH 中),也可以简写为 kitty-ssh

2. 通过 pass 管理多台服务器密码

为了安全地存储和管理多台服务器的 SSH 密码,我们使用 pass。这是一个命令行密码管理工具,使用 GPG 加密来安全存储密码。

Mac 用户安装 pass:

1
brew install pass

2.1 初始化 GPG 密钥

pass 依赖 GPG 进行加密,首先需要生成一个 GPG 密钥对:

1
gpg --full-generate-key

交互式配置过程如下:

  1. 选择密钥类型:输入 1 选择 RSA and RSA(默认选项)
  2. 密钥长度:输入 4096(推荐,更安全)或直接回车使用默认值 2048
  3. 密钥有效期:输入 0 表示永不过期,或输入如 1y(1年)、2y(2年)等
  4. 确认以上信息正确:输入 y 确认
  5. 输入用户信息
    • 真实姓名:例如 John Doe
    • 电子邮件:例如 john@example.com
    • 注释:可选,留空或填写有意义的说明
  6. 确认:检查信息无误后输入 o 确认
  7. 设置 passphrase:输入一个密码来保护你的 GPG 私钥
GPG 密钥生成过程

查看已生成的 GPG 密钥

1
2
gpg --list-secret-keys  # 列出私钥
gpg --list-public-keys # 列出公钥

输出的 sec rsa4096 后面那串字符即为密钥 ID,通常是 8 位或 16 位的十六进制数。

2.2 初始化 pass 密码库

生成 GPG 密钥后,需要初始化 pass 密码库,使其与你的 GPG 密钥关联:

1
2
# 使用 GPG 用户邮箱初始化
pass init "john@example.com"

执行后,pass 会在 ~/.password-store/ 目录下创建加密的密码存储库。

验证初始化是否成功

1
pass  # 列出所有已存储的密码

2.3 配置 SSH Config 文件

~/.ssh/config 文件中定义要连接的服务器。这个文件用于 SSH 客户端的默认配置,可以让 SSH 连接更加便捷。

1
2
3
4
5
# 编辑 SSH 配置文件
vim ~/.ssh/config

# 或使用任意编辑器打开
open ~/.ssh/config

添加服务器配置:

1
2
3
4
5
6
7
8
9
10
11
12
# 服务器 1 的配置
Host server1
HostName 192.168.1.2 # 服务器的实际 IP 地址或域名
User root # 登录用户名
Port 22 # SSH 端口,默认是 22
IdentityFile ~/.ssh/id_rsa #(可选)指定私钥文件路径

# 服务器 2 的配置
Host server2
HostName 192.168.1.3
User root
Port 22

配置项说明

  • Host:连接时使用的主机别名,可以自定义
  • HostName:服务器的真实地址(IP 或域名)
  • User:SSH 登录用户名
  • Port:SSH 服务端口
  • IdentityFile:(可选)指定私钥文件路径
  • ServerAliveInterval:(可选)保持连接的存活时间间隔
  • ForwardAgent:(可选)是否转发 SSH 代理

2.4 存储服务器密码

现在可以存储各服务器的 SSH 密码了。kitty-ssh 脚本中使用的路径格式是 pass ssh/$host,因此存储时需要按照 ssh/主机名 的路径格式来存放。

1
2
3
4
5
# 为 server1 存储密码
pass edit ssh/server1

# 为 server2 存储密码
pass edit ssh/server2

执行上述命令后,会打开默认编辑器(如 vim、nano 或 VS Code),只需输入该服务器的 SSH 密码即可。保存后,pass 会自动使用 GPG 加密存储。

查看已存储的密码

1
2
3
pass                 # 列出所有密码
pass ssh/server1 # 查看 server1 的密码(需要输入 GPG 密钥密码)
pass ls ssh/ # 只列出 ssh 分类下的密码

安全提示

  • GPG 密钥密码就是你的「主密码」,请务必记住
  • 建议定期备份 GPG 私钥:gpg --export-secret-keys > backup.gpg
  • 不要将 SSH 密码明文存储在任何地方

3. 测试最终效果

完成以上所有配置后,按下 cmd+shift+h,你将看到 fzf 交互界面。输入关键字(如 server1)筛选目标主机,按回车即可自动连接。

fzf 主机选择界面

4. 使用 kitten + 密钥登录(进阶)

上述方案适用于需要密码登录的场景。如果你有直接访问服务器的权限,更推荐使用 SSH 密钥认证,Kitty 提供了更强大的集成方案。

Kitty 内置的 kitten ssh 命令可以替代系统自带的 ssh 命令,提供更多高级功能:

  • SSH 代理转发
  • 更好的终端仿真
  • 自动密钥加载
1
2
# 使用 kitten 连接(替换原脚本中的 ssh 命令)
kitten ssh server1

结合本方案的 fzf 交互界面,只需修改 kitty-ssh 脚本的最后几行:

1
2
3
4
5
if [ -z "$password" ]; then
kitten ssh "$host" # 使用 kitten 替代 ssh
else
SSHPASS="$password" sshpass -e ssh "$host"
fi

提示:使用密钥登录后,脚本会优先使用密钥连接,无需输入密码,可以移除密码管理相关的依赖。

Mac下使用Kitty终端快速通过SSH连接服务器

https://www.huihuidehui.com/posts/a1b2c3d4.html

作者

lalaking

发布于

2026-01-17

更新于

2026-01-17

许可协议

评论