Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 客户没有';t在收到所有响应后关闭与服务器的连接_Bash_Netcat - Fatal编程技术网

Bash 客户没有';t在收到所有响应后关闭与服务器的连接

Bash 客户没有';t在收到所有响应后关闭与服务器的连接,bash,netcat,Bash,Netcat,对于一个学校项目,我必须创建一个bash脚本,该脚本与远程netcat服务器通信,并向该服务器发送命令,然后返回响应 在我的客户端脚本中,我有一个sendMessage函数,它向服务器发送消息,然后显示服务器的响应。我的问题是,在收到响应后,netcat仍在等待来自服务器的数据,并且不会关闭连接 我已经尝试了-q参数,但是没有得到我的回答,-w参数几乎是我想要的,但是最小值是1秒,这在我的例子中是不可能使用的 以下是我的功能: function sendMessage { netcat

对于一个学校项目,我必须创建一个bash脚本,该脚本与远程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下面给出了一个很好的答案。我将在我自己的类似问题中使用它。