天天看点

shell 检测 RDP 服务异常,但端口还在监听且有响应的一种方法

近一段时间,工作中不止一次遇到这样的情况:

用户反映有Windows设备(暂命名为A)无法RDP远程登录,登录到同网段的设备(暂命名为B),发现可以从B设备 ping 通 A设备,尝试 telnet A 3389, 也有返回的字符串,但是真正用mstsc登录的时候,就是连不上。

经过观察,发现了这样的一个情况:

使用同网段的另一台设备(暂命名为C),这是一台Linux设备。

首先尝试 telnet B 3389, 有正常返回,需要使用 ^] 退出。

之后继续 telnet A 3389,有正常返回,但是即刻在返回的最后一行出现:Connection closed by foreign host 字样。

经过确认,是设备的RDP服务已经宕了,但是端口还在监听,而且还有看似正常的响应。

为了应对这样的情况,经过查阅资料和多次尝试,目前看可以使用这样的命令进行检测:

#! /bin/bash

file=`mktemp`

timeout 5s telnet 192.168.1.1 3389 > $file 2>&1

grep "Connection closed" $file | wc -l
# 这里,输出为 1 则表明不正常,输出为 0 则表示正常

rm -rf $file
           

原理是,使 telnet 运行很短的时间,并输出到临时文件,然后看文件中是否有即刻连接失败的返回。