如何通过脚本向netcat服务器动态提交1000次求和结果?
问题与解决方案
需求说明
教授布置任务:编写脚本处理netcat服务器的提示,计算服务器给出的两个数的和,连续1000次实时提交求和结果给服务器,不能等连接关闭后再输出结果。已用awk编写提取数字并求和的函数,但无法实现实时传递结果给netcat,尝试直接输出结果和封装函数均未成功。
服务器交互示例
Welcome to the Ultimate Math Contest!! Solve 1000 quick math problems to complete You have 10 second for each problem. What is the sum of 89187 + 26971: You have 5 seconds to type in your stuff... Exit... 116158
当前脚本
#!/bin/bash extract_numbers(){ numbers=($(echo "$output" | awk 'NR==4 {gsub(/[^0-9]+/, " "); var1=$1; var2=$2; print var1, var2}')) number1=${numbers[0]} number2=${numbers[1]} sum=$((number1 + number2)) echo $sum } output=$(echo "" | nc 65.2.97.115 8003) echo "$output" result=$(extract_numbers "$output") echo $result
解决方案
当前脚本的核心问题是用$()捕获nc的全部输出,必须等连接关闭后才能处理,无法实现实时交互。要完成连续1000次实时提交,需要让脚本与nc保持持续的双向通信。
方法1:用awk直接处理并实时响应
将提取、计算逻辑整合到awk中,通过管道与nc直接交互,每拿到一个问题就立即计算并返回结果:
#!/bin/bash nc 65.2.97.115 8003 | awk ' /What is the sum of/ { # 从行中提取两个数字 split($0, parts, /[^0-9]+/) num1 = parts[2] num2 = parts[3] sum = num1 + num2 print sum fflush() # 强制刷新输出缓冲区,避免延迟超时 } '
方法2:用bash循环实时处理
如果想保留bash函数逻辑,可通过进程替换实现双向通信,让nc的输出实时传给bash处理,同时将结果实时写回nc:
#!/bin/bash process_problem() { while read -r line; do # 可选:打印服务器输出用于调试 # echo "$line" if [[ "$line" == *"What is the sum of"* ]]; then # 提取行中的数字 numbers=($(echo "$line" | grep -oE '[0-9]+')) num1=${numbers[0]} num2=${numbers[1]} sum=$((num1 + num2)) echo "$sum" # 将结果发送给服务器 fi done } # 进程替换实现双向通信 nc 65.2.97.115 8003 < <(process_problem)
关键注意点
- 禁止用
$()捕获nc输出,这种方式会阻塞到连接关闭,无法实时响应。 - 必须确保输出无缓冲(awk中用
fflush(),bash中默认行缓冲足够),避免结果延迟发送导致超时。 - 服务器每个问题有时间限制,两种方法都能保证处理速度满足要求。
内容的提问来源于stack exchange,提问作者NITHINN MANICKAM G
相关产品推荐
相关产品推荐

