我正在尝试执行 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