這幾天需要做Linux的TCP端口檢查腳本,發現netstat、nc指令雖好,但不夠直覺,而且端口多了檢查起來有點麻煩,動手學做了兩個腳本。一個是用參數形式檢查端口情況,另一個使用配置檔案掃描端口。記錄下來友善以後使用。
一、nc_check.sh
1
2
3
4
5
6
7
8
9
10
<code>#!/bin/bash</code>
<code>cat</code> <code>.</code><code>/check_port</code><code>|</code><code>while</code> <code>read</code> <code>line</code>
<code>do</code>
<code> </code><code>nc -z `</code><code>uname</code> <code>-n` $line ></code><code>/dev/null</code> <code>2>&1</code>
<code> </code><code>if</code> <code>[ $? -</code><code>eq</code> <code>0 ];</code><code>then</code>
<code> </code><code>echo</code> <code>"$line OK."</code>
<code> </code><code>else</code>
<code> </code><code>echo</code> <code>"$line Failed."</code>
<code> </code><code>fi</code>
<code>done</code>
使用前在目前目錄下建立一個check_port的檔案,内容為:
<code>cat</code> <code>check_port</code>
<code>123</code>
<code>345</code>
<code>456</code>
所有TCP檢測端口按照每行一個記錄到檔案内。執行效果:
<code>[root@ABC ~]</code><code>#. nc_check</code>
<code>123 OK</code>
<code>345 OK</code>
<code>456 Failed</code>
程式把清單内所有端口檢查一遍,成功的OK,失敗的Failed
二、netstat_check.sh
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<code>declare</code> <code>-a CHK_TCP_CMD=`</code><code>netstat</code> <code>-tln|</code><code>egrep</code> <code>0.0.0.0|</code><code>awk</code> <code>'{print $4}'</code><code>|</code><code>awk</code> <code>-F: </code><code>'{print $2}'</code><code>|</code><code>sort</code> <code>-n`</code>
<code>declare</code> <code>-a PORT_NO_EXISTS</code>
<code>declare</code> <code>-i CURRENT_PORT=0</code>
<code>for</code> <code>TCP_PORT </code><code>in</code> <code>$@</code>
<code> </code><code>#IS NUMBER</code>
<code> </code><code>expr</code> <code>"$TCP_PORT"</code> <code>+ 0 ></code><code>/dev/null</code> <code>2>&1</code>
<code> </code><code>if</code> <code>[ </code><code>"$?"</code> <code>!= </code><code>"0"</code> <code>];</code><code>then</code>
<code> </code><code>echo</code> <code>"$TCP_PORT not a number."</code>
<code> </code><code>exit</code> <code>1</code>
<code> </code><code>PORT_NO_EXISTS[$CURRENT_PORT]=$TCP_PORT</code>
<code> </code><code>for</code> <code>LSN_PORT </code><code>in</code> <code>$CHK_TCP_CMD</code>
<code> </code><code>do</code>
<code> </code><code>if</code> <code>[ $TCP_PORT == $LSN_PORT ];</code><code>then</code>
<code> </code><code>unset</code> <code>PORT_NO_EXISTS[$CURRENT_PORT]</code>
<code> </code><code>break</code>
<code> </code><code>fi</code>
<code> </code><code>done</code>
<code> </code><code>((CURRENT_PORT++))</code>
<code>if</code> <code>[ ${</code><code>#PORT_NO_EXISTS[@]} -gt 0 ];then</code>
<code> </code><code>echo</code> <code>"TCP ports ${PORT_NO_EXISTS[@]} failed."</code>
<code> </code><code>exit</code> <code>1</code>
<code>fi</code>
<code>exit</code> <code>0</code>
使用時直接在腳本後添加端口号作為參數,若掃描多個端口号,則每個端口号以空格隔開。若其中一個參數非數字,則程式終止。執行效果:
<code>[root@ABC ~]</code><code>#./netstat_check.sh 789</code>
掃描到的端口無輸出。
<code>[root@ABC ~]</code><code>#./netstat_check.sh 123 456 789</code>
<code>TCP port 123 456 failed.</code>
程式把所有失敗的端口羅列出來。
<code>[root@ABC ~]</code><code>#./netstat_check.sh 123 hello 456</code>
<code>hello not a number.</code>
不是數字的程式輸出錯誤。
本文轉自 gole_huang 51CTO部落格,原文連結:http://blog.51cto.com/golehuang/1768264