Bash

Telnet 連接停止 bash 腳本

  • February 27, 2020

我有一個 bash 腳本,我在其中不斷地從文本文件中讀取主機和埠並創建連接以檢查狀態。

我的程式碼是:

while IFS=";" read -r host ports
do
   eval "arr=($ports)"
   for port in "${arr[@]}";
   do
       echo "connecting to $host on port $port" >> output.txt
       timeout 5s telnet $host $port
       exit_status=$?
       if [[ $exit_status -eq 124 ]]; then
           echo "$host on $port has timed out" >> output.txt
       else
           telnet $host $port >> output.txt
       fi
   echo "---------------------------------------------" >> output.txt
   done
done < "$1"

首先if是檢查連接是否超時。這按預期工作。

else-telnet $host $port中,我正在檢查如果連接沒有超時,則telnet進入遠端主機查看連接是成功還是拒絕

但是,當連接成功時,腳本會突然退出**:**

Escape character is '^]'.
Connection closed by foreign host.

我希望它寫入輸出文件,“連接成功”並繼續讀取 $1 的剩餘部分。

當連接被拒絕時,腳本不退出;它按預期工作——它繼續從 $1 讀取並繼續執行指令。

我也處於無法使用netcat.

正如roaima 指出的那樣,telnet 命令將吸收您已重定向到while循環中的 stdin 輸入。結果,只要其中一個 telnet 連接成功,您的while循環就會結束,因為您會telnet吞噬掉您期望輸入的其餘輸入while

該問題的直接解決方案是重定向telnet的輸入,最簡單的是來自 /dev/null,正如Cyrus 評論的那樣telnet host port >> output.txt < /dev/null

為了區分成功連接和(大概 >5 秒延遲)拒絕連接,我擷取了 telnet 命令的輸出並檢查了“ Connected to”消息。如果該消息存在,我們假設成功;否則:失敗。

對腳本的主要更改是:

  1. telnet從 /dev/null重定向兩者的標準輸入
  2. 引用所有變數
  3. 擷取和檢查else-telnet輸出以進行比較

更新後的腳本:

#!/bin/bash
while IFS=";" read -r host ports
do
   eval "arr=($ports)"
   for port in "${arr[@]}";
   do
       echo "connecting to $host on port $port" >> output.txt
       timeout 5s telnet "$host" "$port" < /dev/null
       exit_status=$?
       if [[ "$exit_status" -eq 124 ]]; then
           echo "$host on $port has timed out" >> output.txt
       else
           output="$(telnet "$host" "$port" 2>&1 < /dev/null)"
           case $output in
             (*Connected\ to\ *)
               echo "connection is successful to $host $port" >> output.txt
               ;;
             (*)
               echo "connection was refused to $host $port" >> output.txt
               ;;
            esac
       fi
       echo "---------------------------------------------" >> output.txt
   done
done < "$1"

引用自:https://unix.stackexchange.com/questions/491350