如何用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
相关产品推荐
相关产品推荐

