Bash 客户没有';t在收到所有响应后关闭与服务器的连接
对于一个学校项目,我必须创建一个bash脚本,该脚本与远程netcat服务器通信,并向该服务器发送命令,然后返回响应 在我的客户端脚本中,我有一个Bash 客户没有';t在收到所有响应后关闭与服务器的连接,bash,netcat,Bash,Netcat,对于一个学校项目,我必须创建一个bash脚本,该脚本与远程netcat服务器通信,并向该服务器发送命令,然后返回响应 在我的客户端脚本中,我有一个sendMessage函数,它向服务器发送消息,然后显示服务器的响应。我的问题是,在收到响应后,netcat仍在等待来自服务器的数据,并且不会关闭连接 我已经尝试了-q参数,但是没有得到我的回答,-w参数几乎是我想要的,但是最小值是1秒,这在我的例子中是不可能使用的 以下是我的功能: function sendMessage { netcat
sendMessage
函数,它向服务器发送消息,然后显示服务器的响应。我的问题是,在收到响应后,netcat仍在等待来自服务器的数据,并且不会关闭连接
我已经尝试了-q参数,但是没有得到我的回答,-w参数几乎是我想要的,但是最小值是1秒,这在我的例子中是不可能使用的
以下是我的功能:
function sendMessage {
netcat -w 1 "$ipAddress" "$port" <<< "$*"
}
函数发送消息{
netcat-w 1“$ipAddress”“$port”您可以exec
nc
作为coproc
,将线路发送到服务器,然后使用带超时的read
读取响应,检查响应是否完成,然后通过向nc
发送信号来关闭连接
除了使用nc
之外,您还可以使用bash-TCP功能,如
exec 5<>/dev/tcp/"$HOST"/"$PORT"
read -t "$TIMEOUT" -n "$MAXLEN" line
exec 5<&- 5>&-
exec 5/dev/tcp/“$HOST”/“$PORT”
读取-t“$TIMEOUT”-n“$MAXLEN”行
执行官5&-
终于找到了一种有效的方法(也许不是最好的,但至少它完美地实现了我想要的:D)
在所有函数完成后,我发送一条“ENDRESPONSE”消息,并在我的客户端上测试是否有此消息:
function sendMessage {
while read line; do
if [[ $line == "ENDRESPONSE" ]]; then
break
else
echo $line
fi
done < <(netcat "$ipAddress" "$port" <<< "$*")
}
函数发送消息{
边读边做
如果[[$line==“ENDRESPONSE”];则
打破
其他的
回音$线
fi
done<您如何知道您已收到服务器的完整响应?这就是问题所在。@zr下面给出了一个很好的答案。我将在我自己的类似问题中使用它。