自动化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
相关产品推荐
相关产品推荐

