You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自动化Telnet脚本异常求助:单命令正常,批量脚本却挂起

问题原因及解决办法

核心问题:循环变量拆分错误

脚本挂起的主要原因是循环遍历数组时未正确处理带空格的元素。当使用for host in ${SERVERS[@]}时,Bash会将数组中每个"主机 端口"字符串的空格视为分隔符,把单个元素拆成两个独立变量。比如第一个元素"abc.gc.ca 100"会被拆成abc.gc.ca和100,循环第一次执行时telnet $host变成telnet abc.gc.ca——缺少端口参数,telnet会进入交互等待状态,直接导致脚本挂起。

修复步骤

1. 正确遍历数组元素

给数组遍历加上引号,确保每个"主机 端口"作为整体传递:

for host_port in "${SERVERS[@]}"; do

2. 显式拆分主机与端口

即使修复了遍历,显式拆分主机和端口能避免潜在的参数解析问题:

for host_port in "${SERVERS[@]}"; do
  read host port <<< "$host_port"
  echo -e "\x1dclose\x0d" |
    telnet "$host" "$port" |
    grep Connected > /dev/null && printf "PASSED\n" || printf "FAILED\n"
done

3. 增加超时机制(推荐)

telnet在连接超时或无响应时仍可能挂起,用timeout命令强制限制执行时间(比如5秒):

for host_port in "${SERVERS[@]}"; do
  read host port <<< "$host_port"
  timeout 5 bash -c 'echo -e "\x1dclose\x0d" | telnet "$1" "$2"' _ "$host" "$port" |
    grep Connected > /dev/null && printf "PASSED\n" || printf "FAILED\n"
done

4. 用netcat替代telnet(更可靠)

telnet的交互特性易引发挂起,nc(netcat)更适合自动化场景,无需发送退出命令,连接后自动关闭:

for host_port in "${SERVERS[@]}"; do
  read host port <<< "$host_port"
  timeout 5 nc -z "$host" "$port" && printf "PASSED\n" || printf "FAILED\n"
done

-z参数表示仅扫描端口是否开放,不发送数据,速度更快且无交互挂起风险。

内容的提问来源于stack exchange,提问作者user1736786

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 18:24:31