文章

SSH 快捷登录

🔑 ssv — SSH 快捷登录

1. 安装 sshpass

brew install sshpass

2. 配置 ssv 命令

编辑 ~/.zshrc,在末尾粘贴:

# ssv — 服务器快捷登录,支持别名和序号
ssv() {
  local conf="$HOME/.config/ssv/servers.conf"
  local lconf="${PWD}/servers.conf"
  local files=""
  [ -f "$lconf" ] && files="$lconf"
  [ -f "$conf" ] && files="${files:+$files }$conf"

  [ -z "$files" ] && { echo "❌ 未找到配置文件"; return 1; }

  local _n=() _e=() _u=() _p=()
  for f in $files; do
    while IFS=' ' read -r a b c d; do
      [ -z "$a" ] || [ "${a#\#}" != "$a" ] && continue
      _n+=("$a"); _e+=("$b"); _u+=("$c"); _p+=("$d")
    done < "$f"
  done

  local cnt=${#_n[@]}

  if [ $# -eq 0 ]; then
    echo "用法: ssv <别名|序号>"
    local i=1; while [ $i -le $cnt ]; do
      echo "  [$i] $_n[$i]  → $_u[$i]@${_e[$i]%%:*}:${_e[$i]##*:}"
      i=$((i+1))
    done
    return
  fi

  local key=$1; local idx=0

  if [ "$key" -eq "$key" ] 2>/dev/null; then
    [ "$key" -lt 1 ] || [ "$key" -gt "$cnt" ] && { echo "❌ 序号超出范围 (1~$cnt)"; return 1; }
    idx=$key
  else
    local i=1; while [ $i -le $cnt ]; do
      [ "$_n[$i]" = "$key" ] && { idx=$i; break; }
      i=$((i+1))
    done
    [ "$idx" -eq 0 ] && { echo "❌ 未知服务器: $key"; return 1; }
  fi

  echo "  → $_u[$idx]@${_e[$idx]%%:*}:${_e[$idx]##*:}"
  sshpass -p "$_p[$idx]" ssh -o StrictHostKeyChecking=no \
    -p "${_e[$idx]##*:}" "$_u[$idx]@${_e[$idx]%%:*}"
}

重载配置:

source ~/.zshrc

3. 配置服务器

全局配置(所有目录生效):

vim ~/.config/ssv/servers.conf
# 格式: 别名 IP:端口 用户名 密码
主服务器  127.0.0.1:22  root  password
ys12      127.0.0.1:22  root  password

当前目录配置(仅该项目生效): 在项目目录下创建 servers.conf,格式同上。ssv 会自动合并显示。

4. 使用

ssv           # 列出所有服务器
ssv 1         # 按序号登录
ssv 主服务器  # 按别名登录
本文由作者按照 CC BY 4.0 进行授权