如何使用 Shell 指令碼來檢視多個伺服器的埠是否開啟?

良許Linux發表於2019-05-13

我們在進行伺服器配置的時候,經常要檢視伺服器的某個埠是否已經開放。如果伺服器只有一兩臺的話,那很好辦,只需要使用 nc 命令一個個檢視即可。

但是,如果你的伺服器是個叢集,有很多臺呢?那如果還一個個手動去檢查的話,效率肯定是無比低下的,年底裁員名單裡肯定有你。

在這種情況下,我們完全可以使用 Shell 指令碼配合 nc 命令來達到我們的目的。而且,不管伺服器有幾臺,需要檢查的埠有幾個,都可以實現這樣的目標。

在本文裡,我們用 Shell 指令碼來實現兩個需求:

  • 掃描多臺伺服器的一個埠是否開啟
  • 掃描多臺伺服器的多個埠是否開啟

在開始之前,我們先來了解一下 nc 命令。

nc 命令簡介

nc 是英文單詞 netcat 的縮寫,它是通過使用 TCP 或 UDP 的網路協議的連線來讀或寫資料,可以直接被第三方程式或指令碼直接呼叫。

同時,它是一款功能非常強大的網路除錯工具,因為它可以建立幾乎所有你所需要的連線方式。

nc 工具主要有三種功能模式:連線模式、監聽模式、通道模式。它的一般使用格式如下:

$ nc [-options] [HostName or IP] [PortNumber]
複製程式碼

接下來,我們就用 Shell 指令碼結合 nc 命令來實現我們的兩個需求。

1. 掃描多臺伺服器的一個埠是否開啟

在這裡,我們先把需要查詢的所有伺服器地址全部放在一個 server-list.txt 檔案裡,每個地址單獨一行,如下:

# cat server-list.txt
192.168.1.2
192.168.1.3
192.168.1.4
192.168.1.5
192.168.1.6
192.168.1.7
複製程式碼

然後,我們再用 for 迴圈依次掃描 server-list.txt 裡對應伺服器的埠是否開啟。在這裡,我們掃描 22 埠是否開啟。

# vi port_scan.sh

#!/bin/sh
for server in `more server-list.txt`
do
#echo $i
nc -zvw3 $server 22
done
複製程式碼

最後,我們給這個指令碼賦予可執行許可權即可。

$ chmod +x port_scan.sh
複製程式碼

之後,我們就可以用這個指令碼來自動依次檢查多個伺服器的 22 埠是否已開啟。

# sh port_scan.sh

Connection to 192.168.1.2 22 port [tcp/ssh] succeeded!
Connection to 192.168.1.3 22 port [tcp/ssh] succeeded!
Connection to 192.168.1.4 22 port [tcp/ssh] succeeded!
Connection to 192.168.1.5 22 port [tcp/ssh] succeeded!
Connection to 192.168.1.6 22 port [tcp/ssh] succeeded!
Connection to 192.168.1.7 22 port [tcp/ssh] succeeded!
複製程式碼

2. 掃描多臺伺服器的多個埠是否開啟

在這裡,我們同樣把需要查詢的所有伺服器地址全部放在一個 server-list.txt 檔案裡,每個地址單獨一行。這裡就不重複演示了。

與此同時,我們也把需要查詢的伺服器埠放在另一個 port-list.txt 檔案裡,每個埠單獨一行,如下所示:

# cat port-list.txt
22
80
複製程式碼

然後,我們再用 for 迴圈依次掃描 server-list.txt 裡對應伺服器 port-list.txt 所列的埠是否開啟。注意,這裡用到了兩個 for 迴圈,第一層是伺服器列表,第二層是埠列表。

# vi multiple_port_scan.sh

#!/bin/sh
for server in `more server-list.txt`
do
for port in `more port-list.txt`
do
#echo $server
nc -zvw3 $server $port
echo ""
done
done
複製程式碼

最後,我們給這個指令碼賦予可執行許可權即可。

$ chmod +x multiple_port_scan.sh
複製程式碼

之後,我們就可以用這個指令碼來自動依次檢查多個伺服器的多個埠是否已開啟。

# sh multiple_port_scan.sh
Connection to 192.168.1.2 22 port [tcp/ssh] succeeded!
Connection to 192.168.1.2 80 port [tcp/http] succeeded!

Connection to 192.168.1.3 22 port [tcp/ssh] succeeded!
Connection to 192.168.1.3 80 port [tcp/http] succeeded!

Connection to 192.168.1.4 22 port [tcp/ssh] succeeded!
Connection to 192.168.1.4 80 port [tcp/http] succeeded!

Connection to 192.168.1.5 22 port [tcp/ssh] succeeded!
Connection to 192.168.1.5 80 port [tcp/http] succeeded!

Connection to 192.168.1.6 22 port [tcp/ssh] succeeded!
Connection to 192.168.1.6 80 port [tcp/http] succeeded!

Connection to 192.168.1.7 22 port [tcp/ssh] succeeded!
Connection to 192.168.1.7 80 port [tcp/http] succeeded!
複製程式碼

碼字不易,如果您覺得有幫助,麻煩點個贊再走唄~

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

我是良許,世界500強外企 Linux 開發工程師,專業生產 Linux 乾貨。歡迎關注我的公眾號「良許Linux」,回覆「1024」獲取最新最全的技術資料,回覆「入群」進入高手如雲技術交流群。

img
img


相關文章