具有自定义超时持续时间的 telnet 命令

具有自定义超时持续时间的 telnet 命令

我正在尝试执行 telnet 命令并获取 shell 脚本的输出。但是当端口未打开或IP不存在时。该命令需要太多时间才能给出响应。是否可以限制 telnet 的最大尝试时间?

telnet host port

答案1

这将运行不超过 2 秒:

[]# echo quit | timeout --signal=9 2 telnet [SERVER] [PORT]

答案2

您可以考虑更简洁的命令 netcat 又名,nc如所讨论的这里

echo 'QUIT' | nc -w SECONDS YOUR_HOST PORT; echo $?

答案3

您必须运行 telnet 吗?我认为超时(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: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

相关内容