前言
在Linux服務器中我們偶爾會需要用到telnet命令來幫助我們判斷當前服務器到其他服務器應用的網(wǎng)絡關系是否開通,交互式的telnet對于我們批量驗證網(wǎng)絡關系并不友好,因此本篇文章將分享一下怎么用腳本的方式來批量驗證telnet的結果。希望對各位讀者有所幫助
在開始之前,我們先簡單說一下telnet命令,telnet命令支持2種模式:會話模式和命令模式,一般情況下我們使用telnet ip port連接到某個服務上面時就會進入到會話模式,此時我們可以通過命令和遠程的服務端進行交互。退出的時候使用ctrl+]退出會話模式(進入到命令模式),再輸入quit退出命令模式,此時才能完全退出telnet命令。
可以看到退出telnet命令略顯麻煩,下面我們來說一下如何快速的退出telnet命令,可以結合echo命令幫助我們完成。在連接成功/失敗后會自動斷開連接。
echo "" | telnet ip port
上面的命令雖然解決了快速退出telnet的需要,但還是不夠優(yōu)雅,因為這里還面臨1個問題:無法控制超時時間,我們可以結合timeout命令來設置一個超時時間,例如下面的例子
echo "" | timeout --signal 9 2 telnet 39.98.74.233 80

上面的腳本解決了處理連接超時的問題,但是結果輸出略顯冗余,我們還可以進一步用腳本做優(yōu)化,使用$?來接收命令的執(zhí)行,以下面的腳本為例,我們來簡單分析一下這個腳本的執(zhí)行流程。
① 定義需要掃描的ip和端口
② 使用timeout命令設置telnet命令的超時時間
③ 使用echo追加字符串來強制退出telnet
這里有個小細節(jié),我們在前面說過telnet退出第一次后會進入到命令模式,想要完整的退出的話需要額外輸入close或者quit命令,這里使用-e命令使echo具備解析轉義字符的能力,而\x1d和\x0d分別對應16進制下的1d和0d,對應ASCII中的空格鍵和回車鍵。從而讓我們可以同時退出telnet的兩種模式。
④ eval命令用于把一長串的命令當做一個整體命令來執(zhí)行,方便我們對輸出結果進行統(tǒng)一的重定向
⑤使用$?判斷telnet命令是否正常聯(lián)通,輸出我們想要的結果語句
PS:如果需要掃描很多組不同的IP和端口的話,建議可以再把下面的腳本優(yōu)化一下,抽一個函數(shù)出來處理。
#!/bin/bash
ipList=("10.10.10.10" "10.33.33.33")
portList=("80")
for ip in ${ipList[@]}
do
for port in $portList
do
eval "echo -e '\x1dclose\x0d' | timeout --signal=9 2 telnet $ip $port" >/dev/null 2>&1
if [ $? -ne 0 ]; then
echo "connect $ip $port fail!"
else
echo "connect $ip $port success."
fi
done
done