0

我试图使用以下脚本来创建一个简单的 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 标志。

4

1 回答 1

0

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

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

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

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

于 2011-09-04T13:04:09.180 回答