这几天需要做Linux的TCP端口检查脚本,发现netstat、nc命令虽好,但不够直观,而且端口多了检查起来有点麻烦,动手学做了两个脚本。一个是用参数形式检查端口情况,另一个使用配置文件扫描端口。记录下来方便以后使用。
一、nc_check.sh
1
2
3
4
5
6
7
8
9
10
|
#!/bin/bash
cat
.
/check_port
|
while
read
line
do
nc -z `
uname
-n` $line >
/dev/null
2>&1
if
[ $? -
eq
0 ];
then
echo
"$line OK."
else
echo
"$line Failed."
fi
done
|
使用前在当前目录下建立一个check_port的文件,内容为:
1
2
3
4
|
cat
check_port
123
345
456
|
所有TCP检测端口按照每行一个记录到文件内。执行效果:
1
2
3
4
|
[root@ABC ~]
#. nc_check
123 OK
345 OK
456 Failed
|
程序把列表内所有端口检查一遍,成功的OK,失败的Failed
二、netstat_check.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
#!/bin/bash
declare
-a CHK_TCP_CMD=`
netstat
-tln|
egrep
0.0.0.0|
awk
'{print $4}'
|
awk
-F:
'{print $2}'
|
sort
-n`
declare
-a PORT_NO_EXISTS
declare
-i CURRENT_PORT=0
for
TCP_PORT
in
$@
do
#IS NUMBER
expr
"$TCP_PORT"
+ 0 >
/dev/null
2>&1
if
[
"$?"
!=
"0"
];
then
echo
"$TCP_PORT not a number."
exit
1
fi
PORT_NO_EXISTS[$CURRENT_PORT]=$TCP_PORT
for
LSN_PORT
in
$CHK_TCP_CMD
do
if
[ $TCP_PORT == $LSN_PORT ];
then
unset
PORT_NO_EXISTS[$CURRENT_PORT]
break
fi
done
((CURRENT_PORT++))
done
if
[ ${
#PORT_NO_EXISTS[@]} -gt 0 ];then
echo
"TCP ports ${PORT_NO_EXISTS[@]} failed."
exit
1
fi
exit
0
|
使用时直接在脚本后添加端口号作为参数,若扫描多个端口号,则每个端口号以空格隔开。若其中一个参数非数字,则程序终止。执行效果:
1
|
[root@ABC ~]
#./netstat_check.sh 789
|
扫描到的端口无输出。
1
2
|
[root@ABC ~]
#./netstat_check.sh 123 456 789
TCP port 123 456 failed.
|
程序把所有失败的端口罗列出来。
1
2
|
[root@ABC ~]
#./netstat_check.sh 123 hello 456
hello not a number.
|
不是数字的程序输出错误。
本文转自 gole_huang 51CTO博客,原文链接:http://blog.51cto.com/golehuang/1768264