循环检查多个IP或端口,发现掉线用信使报警

思路

类似批量ping,循环ping IP的批处理或者小软件,CSDN里面已经有很多,但它们要么是写日志,要么就是本机播放音乐进行报警。
在实际工作中,我们没办法第一时间知道自己关注的设备是否发生了掉线,就没办法做到更快的反应。而我们也不可能随时盯着做报警的电脑,所以本机报警的方式局限性比较大。
于是我就想要一种能够在24小时开机的服务器上做一个扫描的进程,然后远程报警给多个远端工作人员的方式。Linux可以自己配置smtp邮件发送,但是Windows端就没有这么方便。
最后我就想到了Windows的信使服务。

信使服务

信使服务在XP系统中是用net send来工作的,但从Win7开始改成了msg命令,后面的批处理中我以msg命令为例。如果是老版系统请参照修改。

信使服务在win7之后的名称是Terminal Server。出于安全考虑,这个服务默认是不接收来自其他计算机的信使信息的。要打开接收信息的开关,需要进入注册表
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server
找到值 AllowRemoteRPC ,将它的数值改为 1 即可。
发送信使信息的电脑不用打开这个开关,但是接收信息的一定要打开。
网上有些资料说信使服务需要接收端对发送端的身份进行确认才能正常接收,所以要建立用户凭据。因为我是在AD环境中的,所有的用户都能相互验证身份,所以没有这个情况。工作组中是否需要凭据我并没有验证过。

批处理1-Ping命令

我首先想到的还是直接ping对应的IP,在不考虑端口的情况下,能ping通就表示设备在线。
如果需要监控的是不同节点的交换机、网关、VPN隧道或专线对端等,用ping命令比较简单。但是考虑到偶尔会有数据掉包的情况,所以同一个IP至少ping3次,3次全部不通则认为该设备确实是掉线了。

下面是批处理全文:

echo off
@mode con lines=13 cols=80
title ★★网络循环监控中 请勿关闭★★
color 17
:go
for /f %%i in (ip.txt) do (
set i=%%i
ping %%i -w 100 -n 3
if errorlevel 1 goto error
)
echo .
echo 指定IP全部在线,10秒后再次轮询
choice /t 10 /d y /n >nul
goto go
:error
for /f %%c in (it.txt) do (
call msg /time:1800 /server:%%c * %i%掉线ping不通,请尽快排查
)
echo .
echo %i%掉线ping不通,已经发送通知,5分钟后再次开始轮询
echo %date% %time% %i% 掉线未ping通>>NetworkLog.txt
choice /t 300 /d y /n >nul
goto go

由于需要监控的IP不是一个连续的网段,且随时可能发生改变,所以是写在一个外挂txt文本《ip.txt》中的,批处理程序每次进入循环时都会单独读取一次,所以可以在不关闭批处理程序的情况下随时对监控IP池进行添加或删除。
另外,需要被信使通知到的人员(计算机)也可能会发生变化,所以被通知的人我也是写在另一个外挂txt文本《it.txt》里面的。
一旦IP列表中的某一个出现了掉线,那么监控就会触发报警并且忽略掉后面的所有IP,直到掉线的这个IP重新上线或者从ip.txt列表中移除。所以ip.txt的写法就一定要由近到远(相对于搭载批处理的服务器),否则一个很远的IP发生报警,实则可能是最近的网络设备掉线,就会导致判断失误,延误救援的时机。
ip.txt和it.txt都是一行一个地址,可以是计算机名,也可以是对应的IP地址。当然文件名也可以换个不一样的,但是外挂文件和批处理中的名字要对应起来。
另外,为了更好的管理,批处理中还增加了数据记录,一旦有掉线的情况发生,系统会在NetworkLog.txt中记录下日期和时间,以及掉线的IP地址或计算机名。

批处理2-nmap命令(端口监控)

nmap则可以对端口进行监控,这样不仅可以知道设备是否在线,还可以知道它上面的某服务或软件是否正常。但它不是windows自带命令,需要先到nmap.org官网进行下载。
下载并安装完成后,安装程序会添加一个用户环境变量,如果当前的电脑或者服务器的用户名比较多,建议把这个变量修改、添加为系统变量。环境变量需要重新启动电脑才能生效,之后就可以在命令行窗口和批处理中直接使用nmap命令了。
nmap可以通过下面的命令行方式来查看指定设备的指定端口运行状态:

nmap IP -p 端口

如果nmap返回open,则说明端口正常,那么我们可以用findstr来检测返回的内容中是否有open,如果没有,则报警。
报警方式还是采取上一个批处理的信使方式,但nmap不能像ping命令一样设置探测次数,所以可能会有误报。
由于nmap的检测极为快速,我们可以把轮询间隔提高一些。
例如,我们要监控一批设备的80端口是否存活,完整的批处理文本如下:

echo off
@mode con lines=13 cols=80
title ★★网络循环监控中 请勿关闭★★
color 17
:go
for /f %%i in (ip.txt) do (
set i=%%i
nmap %%i -p 80|findstr /I /c:"open"
if errorlevel 1 goto error
)
echo .
echo 指定IP80端口全部在线,20秒后再次轮询
choice /t 20 /d y /n >nul
goto go
:error
for /f %%c in (it.txt) do (
call msg /time:1800 /server:%%c * 检测到%i%80端口异常,请尽快排查
)
echo .
echo %i%80端口异常,已经发送通知,5分钟后再次开始轮询
echo %date% %time% %i% 80端口异常>>NetworkLog.txt
choice /t 300 /d y /n >nul
goto go

批处理3-nmap命令(端口监控-进阶)

第二个批处理适用于监控所有IP的同一个端口。
如果想要监控不同的端口,我们的文本内容和批处理也需要稍加修改。
首先我们建立一个portmonitor.txt。文本内容以“IP:端口”的方式写入,每行一个,注意冒号一定要是英文,例如:

192.168.0.1:80
192.168.5.2:443
10.0.2.3:8080

然后我们在批处理2的基础上稍加修改,引入端口参数即可:

echo off
@mode con lines=13 cols=80
title ★★网络循环监控中 请勿关闭★★
color 17
:go
for /f "tokens=1,2 delims=:" %%i in (portmonitor.txt) do (
set i=%%i
set p=%%j
nmap %%i -p %%j|findstr /I /c:"open"
if errorlevel 1 goto error
)
echo .
echo 指定的端口全部在线,20秒后再次轮询
choice /t 20 /d y /n >nul
goto go
:error
for /f %%c in (it.txt) do (
call msg /time:1800 /server:%%c * 检测到%i%%p%端口异常,请尽快排查
)
echo .
echo %i%%p%端口异常,已经发送通知,5分钟后再次开始轮询
echo %date% %time% %i%:%p%异常>>NetworkLog.txt
choice /t 300 /d y /n >nul
goto go

希望本文能带给大家一些参考。有需要的也可以在评论区留言给我。谢谢。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值