Telnetコマンドを実行してシェルスクリプトの出力を取得しようとしています。ただし、ポートが開いていない場合、またはIPが存在しない場合。コマンドが応答するのに時間がかかりすぎます。 Telnetの最大試行時間を制限できますか?
telnet host port
答え1
これは2秒以内に実行されます。
[]# echo quit | timeout --signal=9 2 telnet [SERVER] [PORT]
答え2
nc
議論したように、より簡潔なコマンドnetcatを考えてみましょう。ここ
echo 'QUIT' | nc -w SECONDS YOUR_HOST PORT; echo $?
答え3
Telnetを実行する必要がありますか?私の考えでは、timeout(1)が役に立つと思います。
代替#1: GNU coreutils の一部であるタイムアウトを使用します。接続を確立できるかどうかは確認されません。
TIMEOUT=10 timeout $TIMEOUT telnet <host> <port>
代替#2: Bash/Perl/Pythonを使ってある程度細分化して同じ問題を解決してください。
いくつかの例は次のとおりです。
大きな打撃: TIMEOUT=10; telnet <host> <port> 2>&1 >/dev/null & WPID=$!; sleep $TIMEOUT && kill $! & KPID=$!; wait $WPID
パール:perl -e "alarm 10; exec @ARGV" "telnet my.server.com 23"
Python: python -c 'import telnetlib;HOST="my.server.com"; PORT=23; TIMEOUT=10; PATTERN="Login: "; t = telnetlib.Telnet (HOST, PORT); t_read = t.read_until(PATTERN, TIMEOUT); print(repr(t_read))'
答え4
ホストに接続できるか、ポートに接続できるか拒否されているか、ホストが動作していることを確認してください。
注:このスクリプトは視覚的なフィードバックのみを提供します。
BASH v4+を使用する例では、リストからホストを読み取り、そのリストのポートを使用します。この例では、ポートをテストし、ホストなどに到達できるかどうかをテストします。
#!/bin/bash
declare -a remote_hosts=("10.10.236.221:8080" "10.10.236.222:22")
for each in ${remote_hosts[@]} ;do
ip=$(echo $each | cut -d ':' -f1)
port=$(echo $each | cut -d ':' -f2)
echo "Connecting ${ip}:${port} .."
telnet $ip $port & WPID=$!
sleep 3
if ps -p $WPID > /dev/null ;then
echo "FAILED TO REACH ($WPID is running)"
kill $! 2>&1 >/dev/null
wait $WPID 2>&1 >/dev/null
fi
done