【问题标题】:"netcat -e" resetting connection after executing script"netcat -e" 执行脚本后重置连接
【发布时间】:2019-01-05 10:52:00
【问题描述】:

我发现了一个类似的问题here,但没有答案。

我编写了这个名为 answer.sh 的脚本:

#!/bin/sh

echo "HTTP/1.1 200 OK

Hello World"

如果我跑步

./answer.sh | nc -c -l -p 8797

然后浏览到 localhost:8797 我得到一个只有“Hello World”文本的网页(这正是我想要的)。

但是如果我跑了

nc -l -p 8797 -e ./answer.sh

浏览器说连接中断。 所以我试试

nc localhost 8797

看看会发生什么,我明白了:

HTTP/1.1 200 OK

Hello World
read(net): Connection reset by peer

我想了解正在发生的事情以及工作方式与其他方式之间(技术上)的区别。

提前致谢。

【问题讨论】:

    标签: shell scripting sh netcat


    【解决方案1】:

    看起来这个问题的答案进展缓慢。我无法使用nc -e 进行测试,所以这不是一个完整的答案,但也许它会帮助开始对话......

    我建议在 HTTP 响应中使用 Content-Length: 标头,例如

    #!/bin/sh
    
    echo "HTTP/1.1 200 OK
    Content-Length: 11
    
    Hello World"
    

    当用于...时

    ./answer.sh | nc -l -p 8797
    

    ...我发现它允许普通浏览器完成请求。没有它,浏览器不知道何时停止读取响应,并等待服务器端关闭连接。

    当从nc localhost 8797 作为客户端连接时,显然这没有区别。 nc 对 HTTP 标头不感兴趣,只会继续阅读,直到服务器端断开连接。

    【讨论】:

    • 完美!这就是解决方案。我刚刚测试过它并且它有效。我还尝试(只是想看看会发生什么)将 Content-Length 参数设置为更低或更高的数字(比实际的字符数)。如果我将其设置为较低的值,则内容将被截断为我选择的数字,如果我将其设置为更大的值,它会给我在开始时遇到的相同错误(只是想测试一下)。所以!非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2021-09-16
    • 2016-10-14
    • 2011-09-10
    • 1970-01-01
    • 2016-06-08
    • 2017-06-20
    • 2020-10-20
    • 2020-04-02
    相关资源
    最近更新 更多