如何在Bash脚本中实现TCP消息收发及响应判断?
Bash实现TCP消息收发与响应判断脚本
下面是完整的Bash脚本实现,包含TCP消息发送、响应接收、结果判断及命令执行逻辑:
#!/bin/bash # 替换为实际的服务器IP和端口 SERVER_IP="192.168.1.100" SERVER_PORT="8080" # 指定需要执行的命令 TARGET_CMD="echo '执行自定义命令'" # 打开TCP连接,绑定到文件描述符3 exec 3<>/dev/tcp/${SERVER_IP}/${SERVER_PORT} # 发送指定消息 echo -n "REMOTE QCH" >&3 # 读取服务器响应(假设响应为单行) read -r response <&3 # 关闭TCP连接 exec 3>&- # 解析响应中斜杠后的数字(如从"@QCH OK 01/14"提取14) suffix=$(echo "$response" | awk -F '[ /]' '{print $NF}') # 判断数字是否大于01(用10#强制十进制,避免0开头被识别为八进制) if (( 10#$suffix > 10#01 )); then echo "响应后缀数字 $suffix 大于01,执行指定命令..." # 执行目标命令 eval "$TARGET_CMD" else echo "响应后缀数字 $suffix 不大于01,不执行命令" fi
关键说明:
- TCP连接处理:用
exec 3<>/dev/tcp/IP/PORT同时打开读写通道,解决单纯写入无法读取响应的问题,操作完成后用exec 3>&-关闭连接。 - 响应解析:通过
awk以空格和斜杠为分隔符,提取最后一个字段作为需要判断的数字。 - 数值比较:用
10#前缀强制按十进制解析数字,防止类似08、09这类数字被Bash识别为无效八进制数。 - 命令执行:将需要执行的命令存放在
TARGET_CMD变量中,用eval执行,可替换为任意合法的Shell命令或脚本路径。
注意事项:
- 确保运行脚本的环境使用Bash(而非sh),因为
/dev/tcp是Bash的内置特性,其他Shell可能不支持。 - 如果服务器响应为多行,可将
read改为循环读取(如while read -r line; do ... done <&3),根据实际情况调整。 - 可添加超时处理逻辑,比如用
timeout命令包裹TCP操作,避免脚本长时间挂起。
内容的提问来源于stack exchange,提问作者jasko887
相关产品推荐
相关产品推荐

