You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Bash脚本检测SSH和VNC连接可用性?

Bash脚本检测SSH和VNC可访问性的可行方法

你之前用/dev/udp失效是因为UDP是无连接协议,它只验证能发出数据包,不管目标端口有没有实际监听服务,所以才会所有IP都显示可访问。SSH和VNC都是基于TCP的服务,得用TCP层面的检测方法才靠谱,下面是几种实用方案:

1. 用Bash内置的/dev/tcp做快速端口检测

Bash自带/dev/tcp虚拟设备,能直接尝试建立TCP连接,判断端口是否开放,无需额外工具。

#!/bin/bash

# 检测SSH(默认22端口,可自定义)
check_ssh() {
    local ip=$1
    local port=${2:-22}
    if timeout 5 bash -c "</dev/tcp/$ip/$port"; then
        echo "$ip SSH(port $port) 可访问"
    else
        echo "$ip SSH(port $port) 不可访问"
    fi
}

# 检测VNC(默认5900对应display 0,display N对应端口5900+N)
check_vnc() {
    local ip=$1
    local port=${2:-5900}
    if timeout 5 bash -c "</dev/tcp/$ip/$port"; then
        echo "$ip VNC(port $port) 可访问"
    else
        echo "$ip VNC(port $port) 不可访问"
    fi
}

# 调用示例
check_ssh "192.168.1.100"
check_vnc "192.168.1.100" 5901

用timeout限制等待时间,避免脚本卡住;</dev/tcp/$ip/$port尝试建立连接,成功返回0,否则非0。

2. 使用nc(netcat)工具做协议级检测

nc是通用网络工具,不仅能检测端口,还能验证服务是否真的是SSH/VNC,避免端口被其他程序占用的误判。

#!/bin/bash

check_ssh() {
    local ip=$1
    local port=${2:-22}
    # 先检测端口是否开放
    if nc -w 5 -zv $ip $port 2>&1 | grep -q "open"; then
        # 进一步验证SSH服务(获取banner)
        if nc -w 5 $ip $port 2>/dev/null | grep -q "SSH-"; then
            echo "$ip SSH(port $port) 可访问(确认为SSH服务)"
        else
            echo "$ip SSH(port $port) 端口开放,但非SSH服务"
        fi
    else
        echo "$ip SSH(port $port) 不可访问"
    fi
}

check_vnc() {
    local ip=$1
    local port=${2:-5900}
    if nc -w 5 -zv $ip $port 2>&1 | grep -q "open"; then
        # 验证VNC服务(发送握手包)
        if echo -n "RFB 003.008\n" | nc -w 5 $ip $port 2>/dev/null | grep -q "RFB"; then
            echo "$ip VNC(port $port) 可访问(确认为VNC服务)"
        else
            echo "$ip VNC(port $port) 端口开放,但非VNC服务"
        fi
    else
        echo "$ip VNC(port $port) 不可访问"
    fi
}

# 调用示例
check_ssh "192.168.1.100"
check_vnc "192.168.1.100"

-z是扫描模式(不发送有效数据),-w设置超时;通过匹配服务的特征响应(SSH的banner、VNC的RFB握手),确保检测的是目标服务。

3. 用ssh命令直接验证可登录性

如果需要确认SSH不仅端口开放,还能正常登录(比如有正确的密钥/密码),可以直接用ssh命令做无交互检测:

#!/bin/bash

check_ssh() {
    local ip=$1
    local port=${2:-22}
    # 无交互尝试登录并退出
    if ssh -o ConnectTimeout=5 -o BatchMode=yes -o StrictHostKeyChecking=no $ip -p $port exit 2>/dev/null; then
        echo "$ip SSH(port $port) 可访问且能正常登录"
    else
        # 区分是端口未开放还是登录失败
        if timeout 5 bash -c "</dev/tcp/$ip/$port"; then
            echo "$ip SSH(port $port) 端口开放,但无法登录(权限/密钥问题)"
        else
            echo "$ip SSH(port $port) 不可访问"
        fi
    fi
}

# 调用示例
check_ssh "192.168.1.100"

BatchMode=yes禁止交互输入,StrictHostKeyChecking=no跳过首次连接的密钥确认;如果能成功执行exit,说明登录权限没问题。

4. 用vncviewer命令行模式检测VNC

如果系统装了vncviewer,可直接用命令行参数做VNC连接检测,无需图形界面:

#!/bin/bash

check_vnc() {
    local ip=$1
    local display=${2:-0}
    local port=$((5900 + display))
    # 用无效密码文件避免交互,设置超时
    if vncviewer -Timeout 5 -passwd /dev/null $ip:$display 2>&1 | grep -q "Connected to"; then
        echo "$ip VNC(display $display, port $port) 可访问"
    else
        echo "$ip VNC(display $display, port $port) 不可访问"
    fi
}

# 调用示例
check_vnc "192.168.1.100" 1

-Timeout设置连接超时,-passwd /dev/null指定空密码文件(避免弹出密码输入框),通过输出中的"Connected to"判断连接是否成功。

内容的提问来源于stack exchange,提问作者zakes24

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 00:13:19