由于本机在实验室服务器已配置免密登录,故根据ssh返回内容判断当前端口状态

#!/bin/bash
 
# --- 请修改下面的变量 ---
SERVER_IP="xxx.xxx.xx.138"      # 你的服务器IP (已根据你的日志填好)
SSH_USER="root"                 # 你的SSH用户名 (已根据你的日志填好)
START_PORT=49100                # 开始扫描的端口 (可以根据情况调整)
END_PORT=49200                  # 结束扫描的端口 (可以根据情况调整)
TIMEOUT=1                       # 每个端口连接的超时时间(秒)
 
echo "🚀 开始扫描服务器 ${SERVER_IP} 上的SSH端口..."
echo "范围: ${START_PORT} - ${END_PORT}"
echo "------------------------------------"
 
for port in $(seq ${START_PORT} ${END_PORT}); do
  # 实时输出,让你知道脚本正在工作
  echo -n "正在尝试端口: ${port}... "
 
  # 执行SSH命令,并将标准错误输出捕获到变量中
  # 2>&1 表示将标准错误(stderr)重定向到标准输出(stdout)
  output=$(ssh -o ConnectTimeout=${TIMEOUT} -o BatchMode=yes -p ${port} ${SSH_USER}@${SERVER_IP} 'exit' 2>&1)
 
  # 检查捕获到的输出内容
  if [ $? -eq 0 ]; then
    echo "✅ 连接成功!"
    echo "--------------------------------------------------------"
    echo "🎉 找到可用的SSH端口: ${port}"
    echo "现在可以使用以下命令登录:"
    echo "ssh -p ${port} ${SSH_USER}@${SERVER_IP}"
    # break # 找到后立即退出循环
  elif [[ "$output" == *"Permission denied"* ]]; then
    # 如果错误信息包含 "Permission denied",说明找到了SSH服务
    echo "✅ 找到SSH端口! (虽然登录被拒,但端口是开放的)"
  elif [[ "$output" == *"Connection refused"* ]]; then
    # 如果是 "Connection refused",说明端口是关闭的
    echo "❌ 连接被拒 (端口关闭)"
  elif [[ "$output" == *"timed out"* ]]; then
    # 如果是超时,说明可能被防火墙DROP了
    echo "⏳ 连接超时 (可能被防火墙过滤)"
  else
    # 其他未知情况
    echo "🤔 未知响应"
  fi
done
 
echo "扫描完成。"