题目要求:使用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