【问题标题】:Using netcat as a simple CGI server使用 netcat 作为简单的 CGI 服务器
【发布时间】:2011-09-04 12:48:46
【问题描述】:

我试图使用以下脚本来创建一个简单的 CGI 服务器(来自http://www.jfranken.de/homepages/johannes/vortraege/netcat_inhalt.en.html)。这更多地是关于它不起作用的技术原因,而不是这是否是一个好主意:

#!/bin/bash
export port=${port:-$1} # inherit $1 as $port
/usr/local/bin/nc -l -p $port -e $0 &  # await further connections on this port
echo "hi"

有谁知道为什么这不能正常工作?第一次执行时,它会在终端上打印“hi”,这是我所期望的。然后我希望 netcat 在指定的端口上等待,准备生成该脚本的新副本,其中 STDOUT 与网络套接字相关联(因为 -e 标志)。因此,对指定端口的 HTTP GET 请求将收到文本“hi”。

实际发生的情况是,每个 GET 请求都会产生一个新的 netcat 进程,一次一个(我期望的),但是直到我杀死最新的 netcat 进程之前,没有一个 GET 请求完成。那时,我发出的第一个 GET 请求以“hi”响应,所有其他请求都以失败的连接尝试返回。我怀疑这与我对 STDOUT 重定向细节的困惑有关,但我的理解是,每次有人连接时,这个脚本只会产生一个新版本,脚本的 STDIN/OUT 应该是网络套接字因为 -e netcat 标志。

【问题讨论】:

    标签: cgi stdout netcat


    【解决方案1】:

    netcat 的 -e 选项将不起作用,除非它使用 -DGAPING_SECURITY_HOLE 编译,这应该让您暂停一下以这种方式做事的智慧。它也是一个选项,仅在 Hobbit 的 netcat 和 bsd-ish 衍生产品中可用,在 GNU netcat 中不可用。

    您能否通过将您的数据输入到 netcat 进程中来获得所需的结果?例如

    echo "hi" | nc -l -p $port 
    

    似乎具有大致相同的效果,但是数据可能在连接之前生成,而不是在使用 -e 标志之后生成。如果您的数据不需要是基于时间的或交互式的,这将是可行的。

    【讨论】:

    • 我在编译时启用了 -DGAPING_SECURITY_HOLE 选项。从命令行本身执行时它确实有效,但我提到的脚本没有按我预期的那样执行。
    • FWIW,你的代码似乎对我有用,除了我在启动它的终端中得到一个“嗨”。但我也将一个交付给我连接的客户端(也是 netcat)进行测试——这大概是目标。但如果可能的话,我仍然鼓励通过管道输入 netcat 而不是用它来执行某些东西。
    猜你喜欢
    • 2017-03-04
    • 1970-01-01
    • 1970-01-01
    • 2017-03-19
    • 2011-08-30
    • 2019-07-24
    相关资源
    最近更新 更多