Shell编程---监控检查某个TCP或UDP端口是否在监听

题目要求:使用Shell脚本监控检查某个TCP或UDP端口是否在监听

分析:

端口检测是系统资源检测经常遇到的,特别是在网络通讯情况下,端口状态的检测往往是很重要的。有时可能进程,CPU,内存等处于正常状态,但是端口处于异常状态,业务也是没有正常运行。
我们可以判断指定端口是否在监听。
首先使用 netstat -an 输出所有端口占用信息,然后通过 grep, awk,wc 过滤输出监听 TCP 端口的个数,第二条语句为输出 UDP 端口的监听个数,如果 TCP 与 UDP 端口监听都为 0,返回 0,否则返回监听的实际个数。

命令:

netstat: 用于显示与 IP、TCP、UDP 和 ICMP 协议相关的统计数据,一般用于检验本机各端口的网络连接情况。

参数:

-a 显示所有连线中的 Socket。
-n 直接使用 IP 地址,而不通过域名服务器。

解答:

命令行测试:
[root@myhost ~]# netstat -an | egrep ":80" 
tcp        0      0 0.0.0.0:8009            0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:8005          0.0.0.0:*               LISTEN     
tcp        0      0 x.x.x.x:53418    x.x.x.x:80         TIME_WAIT  
tcp        0      0 x.x.x.x:44562    x.x.x.x:80        ESTABLISHED
tcp        0      0 x.x.x.x:80       x.x.x.x:53613       ESTABLISHED
tcp        0      0 x.x.x.x:80       x.x.x.x:68270     ESTABLISHED
tcp        1      0 x.x.x.x:44188    x.x.x.x:8189     CLOSE_WAIT 
tcp        0      0 x.x.x.x:80       x.x.x.x:53517       ESTABLISHED
tcp        0      0 x.x.x.x:80       x.x.x.x:53714       ESTABLISHED
tcp        0      0 x.x.x.x:80       x.x.x.x:64956       TIME_WAIT  
tcp        0      0 x.x.x.x:80       x.x.x.x:63251       ESTABLISHED
tcp        0      0 x.x.x.x:80       x.x.x.x:53915       ESTABLISHED
tcp        0      0 x.x.x.x:80       x.x.x.x:56410       ESTABLISHED
udp        0      0 x.x.x.x:80      0.0.0.0:*                          
udp        0      0 127.0.0.1:187           0.0.0.0:*                          
udp        0      0 0.0.0.0:187             0.0.0.0:*                          
udp6       0      0 :::187                  :::*
[root@myhost ~]# netstat -an | egrep ":80" | awk '$1 == "tcp" && $NF == "LISTEN" {print $0}'
tcp        0      0 0.0.0.0:8009            0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:8005          0.0.0.0:*               LISTEN     
[root@myhost ~]# netstat -an | egrep ":80" | awk '$1 == "tcp" && $NF == "LISTEN" {print $0}'|wc -l
3

----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------

[root@myhost ~]# netstat -an | egrep ":80" 
tcp        0      0 0.0.0.0:8009            0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:8005          0.0.0.0:*               LISTEN     
tcp        0      0 x.x.x.x:53418    x.x.x.x:80         TIME_WAIT  
tcp        0      0 x.x.x.x:44562    x.x.x.x:80        ESTABLISHED
tcp        0      0 x.x.x.x:80       x.x.x.x:53613       ESTABLISHED
tcp        0      0 x.x.x.x:80       x.x.x.x:68270     ESTABLISHED
tcp        1      0 x.x.x.x:44188    x.x.x.x:8189     CLOSE_WAIT 
tcp        0      0 x.x.x.x:80       x.x.x.x:53517       ESTABLISHED
tcp        0      0 x.x.x.x:80       x.x.x.x:53714       ESTABLISHED
tcp        0      0 x.x.x.x:80       x.x.x.x:64956       TIME_WAIT  
tcp        0      0 x.x.x.x:80       x.x.x.x:63251       ESTABLISHED
tcp        0      0 x.x.x.x:80       x.x.x.x:53915       ESTABLISHED
tcp        0      0 x.x.x.x:80       x.x.x.x:56410       ESTABLISHED
udp        0      0 x.x.x.x:80      0.0.0.0:*                          
udp        0      0 127.0.0.1:187           0.0.0.0:*                          
udp        0      0 0.0.0.0:187             0.0.0.0:*                          
udp6       0      0 :::187                  :::*
[root@myhost ~]# netstat -an | egrep ":80" | awk '$1 == "udp" && $NF == "0.0.0.0:*" {print $0}'
udp        0      0 x.x.x.x:80      0.0.0.0:*                 
[root@myhost ~]# netstat -an | egrep ":80" | awk '$1 == "udp" && $NF == "0.0.0.0:*" {print $0}'|wc -l
1

脚本:

#!/bin/sh
source /etc/profile

#define variable
port=$1

TCPListeningnum=`netstat -an | egrep ":${port}" | awk '$1 == "tcp" && $NF == "LISTEN" {print $0}' |wc -l`
UDPListeningnum=`netstat -an | egrep ":${port}" | awk '$1 == "udp" && $NF == "0.0.0.0:*" {print $0}' |wc -l`

((TotalListeningnum = TCPListeningnum + UDPListeningnum ))

if [ ${TotalListeningnum} == 0 ];
	then
		echo "the TotalListeningnum is 0"
	else
		echo "the TotalListeningnum is ${TotalListeningnum}"
fi


猜你喜欢

转载自blog.csdn.net/yuki5233/article/details/84032395