Bash脚本连接检测需求:telnet成功跳过netcat,双失败需报错
改进后的Bash端口检测脚本
需求实现
脚本优先通过telnet检测指定host:port的连通性:
- telnet连接成功则直接输出结果,跳过netcat检测
- telnet连接失败或未安装时,自动尝试netcat检测
- 两者均检测失败时,输出错误信息并终止脚本
修改后的完整脚本
#!/bin/bash read -p "请输入主机IP地址: " REMOTEHOST read -p "请输入端口号: " REMOTEPORT TIMEOUT=5 # 执行telnet检测,屏蔽冗余输出并捕获退出状态码 echo quit | timeout --signal=9 $TIMEOUT telnet "$REMOTEHOST" "$REMOTEPORT" >/dev/null 2>&1 TELNET_EXIT=$? if [ $TELNET_EXIT -eq 0 ]; then echo "已成功连接到 ${REMOTEHOST}:${REMOTEPORT} (通过telnet)" elif command -v nc >/dev/null 2>&1; then # 尝试netcat检测 if nc -w $TIMEOUT -z "$REMOTEHOST" "$REMOTEPORT"; then echo "已成功连接到 ${REMOTEHOST}:${REMOTEPORT} (通过netcat)" else echo "错误:无法连接到 ${REMOTEHOST}:${REMOTEPORT},telnet和netcat检测均失败" >&2 exit 1 fi else echo "错误:无法连接到 ${REMOTEHOST}:${REMOTEPORT},telnet检测失败且未找到netcat工具" >&2 exit 1 fi
关键修改说明
- 简化输入流程:用
read -p合并提示语与输入命令,更简洁 - 屏蔽冗余输出:将telnet的输出重定向到
/dev/null,避免打印无关的连接日志 - 捕获退出状态:通过
TELNET_EXIT=$?获取telnet的执行结果,0表示连接成功 - 工具存在性检查:用
command -v nc判断netcat是否安装,避免执行不存在的命令 - 错误处理:当两种工具都无法成功连接时,将错误信息输出到标准错误流(
>&2),并以非0状态码exit 1终止脚本,方便外部调用判断执行结果 - 变量安全:给
REMOTEHOST和REMOTEPORT加上双引号,避免包含特殊字符时出现语法错误
内容的提问来源于stack exchange,提问作者Vortex
相关产品推荐
相关产品推荐

