1. 程式人生 > >指令碼實現telnet檢測指定機器埠的連通性

指令碼實現telnet檢測指定機器埠的連通性

#!/bin/ksh


# shell script: checklink.sh
# function: auto check the link of server IP and PORT
# date:   2016.04.07
# modify: 2016.04.07
# copyright by Li Jian.

#根據系統型別的不同,載入系統環境變數
if [ `uname` = "Linux" ]
then
  PROFILE=.bash_profile
else
  PROFILE=.profile

fi

. $HOME/$PROFILE

#在指令碼執行目錄下建立日誌檔案 .log 和檢測的最終結果檔案.dat
resultfile=$PWD/checklink.dat
log_file=$PWD/checklink.log

#判斷指令碼執行的時候傳遞的引數個數是否正確,包括ip地址和埠號port兩個引數
if [ $# -ne 2 ]
then
    echo `date +"%Y.%m.%d %T"`"the parameter numbers are not correct,exit!" >>${log_file}
    exit
fi

#讀取傳遞的指令碼引數
IP=$1
port=$2

#判斷兩個引數是否為空
if [ -z $IP -o -z $port ]
then
    echo `date +"%Y.%m.%d %T"`"the parameter should not be null,exit!" >>${log_file}
    exit
fi

#通過Ping命令先檢測指定的ip地址是否能連通,通過ping命令傳送四個包(可以是傳送另外的數量),限制超時時間為3秒鐘(也可以是其他值,具體要看能忍受多長時間的延遲),主要根據丟包的比例來決定該ip地址是否能連通,比如ping 百度返回id結果如下:

[email protected]:~/lijian$ ping www.baidu.com -c 4 -w 3
PING www.a.shifen.com (180.97.33.108) 56(84) bytes of data.
64 bytes from 180.97.33.108: icmp_seq=1 ttl=128 time=3.79 ms
64 bytes from 180.97.33.108: icmp_seq=2 ttl=128 time=5.32 ms
64 bytes from 180.97.33.108: icmp_seq=3 ttl=128 time=3.92 ms


--- www.a.shifen.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2004ms

RATE=`ping -c 4 -w 3 $IP | grep 'packet loss' | grep -v grep | awk -F',' '{print $3}' | awk -F'%' '{print $1}'`     #得到丟包的比例的數值
#RATE=`ping -c 4 -w 3 $IP | grep 'packet loss' | grep -v grep | cut -f3 -d, | cut -f1 -d%`


if [ $RATE -eq 100 ]     #這個值具體可以設定成75、50等等,這裡設定成包全丟的情況下為不通
then
    echo `date +"%Y.%m.%d %T"`" ping the $IP is not connected, FAILURE" >${log_file}
    echo "FAILURE"           #全丟了說明該IP地址不通
else
    telnet $IP $port<<@@@ 2>${resultfile} 1>&2               #否則telnet命令檢測指定埠號PORT是否連通,如果可以連通,則立馬quit退出連線,將連線結果和錯誤資訊等都寫入到結果檔案中
quit
@@@


    RESULT=`cat ${resultfile} 2>/dev/null | grep "Connection closed by foreign host" | wc -l`        #匹配看結果檔案中手否有這句話
    echo `date +"%Y.%m.%d %T"`"the result of telnet is $RESULT" >${log_file}
    
    if [ $RESULT -eq 1 ]
    then
        echo `date +"%Y.%m.%d %T"`" telnet the $IP and $port SUCCESS" >>${log_file}         #如果有的話就說明該埠是通的,返回結果字串SUCCESS到檔案並同時列印大螢幕上
        echo "SUCCESS"
    else
        echo `date +"%Y.%m.%d %T"`" telnet the $IP and $port FAILURE" >>${log_file}           #否則就說明該埠是不通的,列印FAILURE
        echo "FAILURE"
    fi
fi


rm -f ${resultfile}            #刪除結果檔案,日誌檔案保留

以上就是指令碼檔案 checklink.sh,用於自動的檢測指定機器埠的連通性。

執行的時候先賦予指令碼執行許可權:

chmod +x checklnk.sh

然後執行指令碼並傳遞兩個引數:第一個IP地址,第二個埠號,比如:

./checklink.sh 192.168.25.67 21

疑問:這裡為何不直接呼叫telnet命令來檢測指定IP地址和埠號,而需要先呼叫ping命令,再呼叫telnet命令呢?

解答:對於telnet命令,當傳遞的ip地址不同的時候,就會陷入長時間的等待中,因為telnet不可設定超時時間,所以需要先通過ping命令篩除掉那些IP地址不通的IP,再通過telnet判斷指定的埠,若是埠不通的話telnet會立刻返回的,如果短靠譜是可以連通,則立即quit退出telnet登陸,根據返回結果判斷是否連通。

這裡還有一篇很好的帖子,通過C語言程式來設定和控制telnet 的返回超時時間的,很經典

http://bbs.csdn.net/topics/340269286


相關推薦

指令碼實現telnet檢測指定機器通性

#!/bin/ksh # shell script: checklink.sh # function: auto check the link of server IP and PORT # date:   2016.04.07 # modify: 2016.04.07 #

Linux環境測試機器通性

生產中,有很大一部分的問題都是由於不同機器間網路不同導致的,那麼如何判斷兩臺機器之間的連通性?本文介紹幾種常見的方式: telnet方法 wget方法 ssh方法 curl方法 1. telnet方法 格式:telnet ip port 說明:i

Flume實戰一,Flume配合telnet指定網路採集資料輸出到控制檯

1、使用Flume的關鍵就是寫配置檔案 1)配置Source 2)配置Channel 3)配置Sinks 4)將以上三種元件串聯起來 在cd $FLUME_HOME/conf vim example.conf #example.conf內容 # a1可以看做是f

telnet檢視遠端機器是否可以訪問

導讀 今天在Linux下面用tomcat部署了web應用,看日誌什麼的都沒有問題,但在windows下面就是不能訪問。 最後推測是Linux的沒有把tomcat的8080埠對外開放 windows

Linux和Windows下的NC(Netcat)命令測試通性

一、Linux OS 環境下(以Centos為例),使用nc命令分別測試TCP和UDP埠連通性: 安裝方法: 在客戶端和伺服器端分別安裝nc工具,安裝命令如下: yum install nc 1 1. Linux OS下使用nc命令,實現TCP方式監聽伺服器端5000

使用 PsPing & PaPing 進行 TCP 通性測試

PsPing & PaPing 介紹 通常,我們測試資料包能否通過 IP 協議到達特定主機時,都習慣使用 ping 命令。工作時 ping 向目標主機發送一個 IMCP Echo 請求的資料包,並等待接收 Echo 響應資料包,通過響應時間和成功響應的次數來估算丟包率和網路時延。但是在 Azure

使用telnet測試指定通性

大家好,我是良許。 大家知道,`telnet` 是一個閹割版的 `ssh` ,它資料不加密,資料容易被盜竊,也容易受中間人攻擊,所以預設情況下 telnet 埠是必須要被關閉的。 telnet為使用者提供了在本地計算機上完成遠端主機工作的能力,因此可以通過telnet來測試埠的連通性。 #### 確認遠

利用主機轉發實現對QEMU虛擬機器的訪問

作  者:郝慶豐 領 域:QEMU   適宜讀者:QEMU及虛擬化相關開發人員 背景知識:虛擬化基礎知識,QEMU基礎知識 正文: 利用主機埠轉發實現對QEMU虛擬機器的訪問 命令 選項:hostfwd 詳細描述:hostfwd=[t

netty自定義訊息實現心跳檢測與重

其實客戶端心跳傳送用到的是IdleStateHandler,詳細看程式碼你就會明白為什麼。 //處理空閒狀態事件的處理器 pipeline.addLast(new IdleStateHandler(6,7,8, TimeUnit.SECONDS)); 在IdleSt

基於SSH轉發實現telnet的安全傳輸

學過一點Linux的人看到這題目,可能就感覺有點白痴。確實,SSH的一大功能就是加密的遠端登入,何必多此一舉。 在此,不得不先宣告,本文的重點是實現SSH安全埠轉發的功能。熟悉SSH的人都知道,埠轉發也是SSH的一大功能。此功能可以加密非安全的TCP連線,如:FTP,IMAP,HTTP等協議。之所以選

Python學習13_Python指令碼實現查詢指定目錄下包含指定關鍵字的檔案

#!/usr/bin/python # coding:utf8 import os     # 判斷檔案中是否包含關鍵字,是則將檔案路徑打印出來 def is_file_contain_word(file_list, query_word):     for _file in

linux下用telnet檢測遠端是否開啟

方法一. 常用telnet 118.10.6.128 88方式測試遠端主機埠是否開啟。   方法二. nmap ip -p port 測試埠  nmap ip 顯示全部開啟的埠 根據顯示close/open確定埠是否開啟。   方法三. nc -

Python實現Telnet自動連線檢測密碼

最近在學習Python網路相關程式設計,這個程式碼實現了Telnet自動連線檢測root使用者密碼,密碼取自密碼本,一個一個檢測密碼是否匹配,直到匹配成功,螢幕輸出停止。 程式碼如下: #encoding=utf-8 import telnetlib import tim

Python指令碼實現查詢指定目錄下包含指定關鍵字的檔案

#!/usr/bin/python # coding:utf8 import os # 判斷檔案中是否包含關鍵字,是則將檔案路徑打印出來 def is_file_contain_word(file

利用telnet命令檢測遠端主機是否正常開放

安裝telnet。我的win7下就沒有telnet,在cmd下輸入telnet提示沒有該命令。於是我們進入控制面板---->程式---->開啟或關閉windows功能。然後等一段時間,在出來的對話方塊把telnet客戶端和telnet伺服器勾選上,其他的不用管,

python實現指定ip掃描

在Linux中判斷一臺主機是否可達,可以使用ping命令,而判斷埠是否開啟,可以使用telnet命令,但是telnet命令沒有超時時間的引數,使用起來不是很方便,那麼可以利用Python來完成一個埠掃描的功能 socket實現埠掃描 #!/usr/bin

在iterm中用expect指令碼實現ssh, telnet對aix, linux的自動登入

在mac上轉戰iterm以後,才知道自動登入的內部原理,原來可以用expect指令碼做和伺服器的自動互動,當然自動登入只是其中的一小部分功能啦 ssh自動登入: #!/usr/bin/expect

高可用服務之Keepalived利用指令碼實現服務的可用性檢測

  上一篇部落格主要聊到了keepalived高可用LVS叢集的相關配置,回顧請參考https://www.cnblogs.com/qiuhom-1874/p/13659428.html;keepalived高可用LVS叢集是Keepalived的設計之初的功能,所以它高可用LVS叢集內建了對LVS的RS的健

輕松Angularjs實現表格按指定列排序

filter click arc 我們 點擊 ont 想要 log ner   angular表格點擊序號進行升序,再次點擊進行降序排序,在輸入框輸入信息,出現相對應數據的那一行。  html: <input type="text" ng-model="se

簡單馬爾可夫模型的實現(簡單的機器學習)

自然語言 index 馬爾科夫 ref item model not 次數 read 馬爾可夫模型(Markov Model)是一種統計模型,廣泛應用在語音識別,詞性自動標註,音字轉換,概率文法等各個自然語言處理等應用領域。經過長期發展,尤其是在語音識別中的成功應用,使它成