哪些实用脚本能简化SSH连接管理?

wen 实用脚本 1

本文目录导读:

哪些实用脚本能简化SSH连接管理?

  1. 核心思想:利用 SSH 配置文件(~/.ssh/config
  2. 最实用的 Shell 脚本:动态菜单选择器
  3. 专业工具推荐
  4. 高级 Bash 函数(直接写入 ~/.bashrc~/.zshrc
  5. 总结:如何选择?

针对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密钥。
  • 需要自动化部署: 使用 AnsibleFabric(Python库),它们本身就内置了SSH批量管理功能。

安全建议:永远不要将密码硬编码在脚本里,使用 ssh-keygen 生成密钥对,并将公钥添加到服务器的 ~/.ssh/authorized_keys 中,对于敏感环境,配置 SSH Agent Forwarding 而不是复制私钥。

抱歉,评论功能暂时关闭!