Bash
Telnet 連接停止 bash 腳本
我有一個 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
”消息。如果該消息存在,我們假設成功;否則:失敗。對腳本的主要更改是:
telnet
從 /dev/null重定向兩者的標準輸入- 引用所有變數
- 擷取和檢查
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"