本文目录导读:

- 核心思想:利用 SSH 配置文件(
~/.ssh/config) - 最实用的 Shell 脚本:动态菜单选择器
- 专业工具推荐
- 高级 Bash 函数(直接写入
~/.bashrc或~/.zshrc) - 总结:如何选择?
针对SSH连接管理的简化,有许多实用脚本和工具可以显著提升效率,特别是当你需要管理多台服务器或频繁连接时,以下是几类非常实用的方案,从轻量脚本到专业工具,按推荐程度排序:
核心思想:利用 SSH 配置文件(~/.ssh/config)
这是最基础、最无依赖的简化方法,虽然严格来说不是“脚本”,但它的效果等同于脚本,是其他所有高级方案的基础。
配置示例 (~/.ssh/config):
# 为服务器起别名,简化连接
Host myserver
HostName 192.168.1.100 # 或 example.com
User root
Port 22
IdentityFile ~/.ssh/my_key_rsa
# 批量管理同网段或同配置的服务器
Host dev-*
User developer
IdentityFile ~/.ssh/dev_key
Port 2222
ServerAliveInterval 60
# 跳板机(堡垒机)配置
Host jumpbox
HostName jump.example.com
User admin
ForwardAgent yes
Host internal-*
User internal_user
ProxyJump jumpbox # 通过跳板机连接
使用效果: 配置后,直接 ssh myserver 即可连接,无需记忆IP、端口和用户名。
最实用的 Shell 脚本:动态菜单选择器
当你有几十台服务器时,用 ~/.ssh/config 逐个记忆别名也不现实,以下脚本能列出所有配置的主机,供你选择连接。
脚本:ssh-select.sh
#!/bin/bash
# 从 ~/.ssh/config 中提取 Host 字段(排除通配符 *)
hosts=$(grep -E "^Host " ~/.ssh/config | awk '{print $2}' | grep -v '\*' | sort)
if [ -z "$hosts" ]; then
echo "错误:~/.ssh/config 中没有找到配置的主机。"
exit 1
fi
echo "可用的 SSH 主机:"
select host in $hosts "退出"; do
if [ "$host" == "退出" ]; then
echo "已退出。"
exit 0
elif [ -n "$host" ]; then
echo "正在连接: $host ..."
ssh "$host"
break
else
echo "无效选择,请重新输入。"
fi
done
使用方法: chmod +x ssh-select.sh && ./ssh-select.sh
进阶版 (支持模糊搜索): 使用 fzf 工具进行交互式搜索,体验极佳:
#!/bin/bash
# 依赖:fzf (通过 brew install fzf 或 apt install fzf 安装)
host=$(grep -E "^Host " ~/.ssh/config | awk '{print $2}' | grep -v '\*' | fzf --height=40% --reverse --prompt="选择 SSH 目标 > ")
if [ -n "$host" ]; then
ssh "$host"
fi
专业工具推荐
如果管理大量服务器(几十台以上),建议直接使用以下成熟工具,它们比手写脚本更强大:
(a)autossh —— 自动重连脚本
- 用途: 保持长时间SSH连接,网络中断后自动重连。
- 典型用法:
autossh -M 0 -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" -N -L 8888:localhost:8888 myserver(端口转发) - 安装:
sudo apt install autossh
(b)tmux + tmuxp —— 会话持久化
- 用途: 将SSH连接保存在tmux窗口中,关闭终端后会话仍在后台运行。
- 工作流:
tmux new -s mysession→ 内部ssh myserver→ 下次tmux attach -t mysession即可。
(c)sshpass —— 非交互式密码登录(仅限无可避免的旧系统)
- 危险提示: 密码会明文出现在命令历史或脚本中,不推荐,仅用于已废弃的旧系统。
- 用法:
sshpass -p 'your_password' ssh user@host
高级 Bash 函数(直接写入 ~/.bashrc 或 ~/.zshrc)
将以下代码添加到你的Shell配置文件中,重启终端后即可使用 sshm 命令:
# 增强的 SSH 连接函数
sshm() {
if [ -z "$1" ]; then
# 无参数则显示菜单
hosts=$(grep -E "^Host " ~/.ssh/config | awk '{print $2}' | grep -v '\*' | sort)
echo "可用的 SSH 主机:"
select host in $hosts; do
if [ -n "$host" ]; then
break
fi
done
ssh "$host"
else
# 有参数则直接连接,并支持自动补全
ssh "$1"
fi
}
# 自动补全支持(按Tab列出所有Host)
_sshm_completion() {
local hosts
hosts=$(grep -E "^Host " ~/.ssh/config | awk '{print $2}' | grep -v '\*' | sort)
COMPREPLY=($(compgen -W "$hosts" -- "${COMP_WORDS[1]}"))
}
complete -F _sshm_completion sshm
效果: 输入 sshm 回车 → 显示菜单;输入 sshm mys 按Tab → 自动补全为 myserver。
如何选择?
- 如果你只有不到10台服务器: 仅使用
~/.ssh/config+ssh myserver即可。 - 如果你有10-30台服务器: 使用基于
fzf的选择脚本或上述sshm函数。 - 如果你管理超过50台服务器或需要团队协作: 考虑使用
Termius(跨平台GUI)、SecureCRT(专业GUI)或mRemoteNG(Windows)。绝对不要编写复杂的密码管理脚本,密码应使用SSH密钥。 - 需要自动化部署: 使用
Ansible或Fabric(Python库),它们本身就内置了SSH批量管理功能。
安全建议:永远不要将密码硬编码在脚本里,使用 ssh-keygen 生成密钥对,并将公钥添加到服务器的 ~/.ssh/authorized_keys 中,对于敏感环境,配置 SSH Agent Forwarding 而不是复制私钥。