如何比对慢速netcat客户端的输出与test.out参考文件的内容?
问题原因
readarray -t参数会移除每行末尾的换行符,直接用printf $ELEMENT发送内容时没有补充换行,服务端无法识别完整指令,会一直等待后续输入导致卡住- 循环遍历数组时没有给变量加引号,若行内容包含空格/特殊字符会被拆分,发送错误的指令格式
- 部分版本netcat的
-q -1参数逻辑异常:该参数定义为收到EOF后等待N秒再退出,-1属于非法值,会导致nc连接不主动关闭 - 管道默认启用块缓冲,netcat的输出不会实时传递给diff,可能导致感知上的卡住
修复方案
使用调整后的脚本即可:
readarray -t FILES < text.in for ELEMENT in "${FILES[@]}" do printf '%s\n' "$ELEMENT" sleep 2 done | stdbuf -o0 nc -q 0 localhost 5555 | diff - test.out
调整说明
- 给
${FILES[@]}加双引号保证每行内容原样遍历 printf '%s\n' "$ELEMENT"主动补充每行的换行符,服务端可以正常识别单条指令- 用
stdbuf -o0关闭nc的标准输出缓冲,收到服务端返回后立即传递给下游diff - 将
-q -1改为合法值-q 0,发送完所有指令后等待服务端关闭连接就立即退出,不会挂住
如果你使用的是OpenBSD版本netcat(如macOS默认自带的nc),没有
-q参数,可以将-q 0替换为-N即可正常运行。
内容的提问来源于stack exchange,提问作者leoneu
相关产品推荐
相关产品推荐

