进一步阅读

进一步阅读

我正在尝试实现一个 TCP 侦听器,它接受连接,然后简单地删除其所有输入(用于测试工具)。

现在,我正在使用socat - tcp-listen:2003,fork,reuseaddr,但这会将输入打印到标准输出。我不想那样。

我无法将输出重定向到/dev/null,因为我是在alpine/socat 码头集装箱,并且它实际上并没有使用 shell,因此重定向不起作用。

如果我尝试使用socat /dev/null tcp-listen:2003,fork,reuseaddr,那么任何连接都会立即断开,大概是因为socat无法读取/dev/null

实现 TCP 侦听器(将所有内容简单地丢弃在地板上)的最佳方法是什么?

答案1

socat /dev/null,ignoreeof tcp-listen:2003,fork,reuseaddr

答案2

最佳是一个棘手的标准,但可以观察到 Docker 对于这一点就像 Microsoft Excel 一样必要。 ☺

我们已经知道一个 Unix 程序会读取输入直到 EOF 并有效地丢弃它:

猫 > /dev/null

将其转变为 TCP 服务器是一个非常简单的练习。 这就是 UCSPI-TCP 的全部内容。 它采用使用标准 I/O 的程序,并在它们周围包装一个简单的框架,使它们成为 TCP 服务器。人们可以用其他东西替代cat并更改服务协议,而不必担心传输。人们可以类似地用 UCSPI-LOCAL 工具替换 UCSPI-TCP 工具,并更改传输,而无需对cat.

有多个 UCSPI-TCP 工具集。丹尼尔·J·伯恩斯坦写过一篇。洛朗·贝尔科特写过一篇。格里特·佩普(Gerrit Pape)写了一篇。亚当·桑普森写了一篇。我写了一篇。此外,人们可以混合和匹配多个工具集中的工具,这些东西是故意易于组合的。人们可以使用我的fdredir或 Laurent Bercot 的redirfd,甚至生成一个非交互式的sh. (前两者的开销比成熟的 低sh,并且 nosh 工具fdredir甚至是内置的,因此它进一步避免了通过外部命令链接的开销。)

所以有几种方法可以做到这一点:

  1. Bernstein tcpserver(原始或 djbwares;不支持 IPv6)
    1. tcpserver -R -H -l 0 0.0.0.0 2003 fdredir --write 1 /dev/null cat
    2. tcpserver -R -H -l 0 0.0.0.0 2003 redirfd -w 1 /dev/null cat
    3. tcpserver -R -H -l 0 0.0.0.0 2003 sh -c 'exec > /dev/null cat'
  2. Hoffman tcpserver(支持 IPv4 和 IPv6;具有原始 Bernstein 默认的 DNS 和 INFO 查找功能,需要关闭)
    1. tcpserver -R -H -l 0 ::0 2003 fdredir --write 1 /dev/null cat
    2. tcpserver -R -H -l 0 ::0 2003 redirfd -w 1 /dev/null cat
    3. tcpserver -R -H -l 0 ::0 2003 sh -c 'exec > /dev/null cat'
  3. 我的tcpservershim(同时支持 IPv4 和 IPv6,但必须为每个实例运行单独的实例;具有更现代的默认值)
    1. tcpserver ::0 2003 fdredir --write 1 /dev/null cat
    2. tcpserver ::0 2003 redirfd -w 1 /dev/null cat
    3. tcpserver ::0 2003 sh -c 'exec > /dev/null cat'
  4. 我的 UCSPI-TCP 工具(同时支持 IPv4 和 IPv6,在 Linux 和 FreeBSD 上合二为一)
    1. tcp-socket-listen --combine4and6 ::0 2003 tcp-socket-accept fdredir --write 1 /dev/null cat
    2. tcp-socket-listen --combine4and6 ::0 2003 tcp-socket-accept redirfd -w 1 /dev/null cat
    3. tcp-socket-listen --combine4and6 ::0 2003 tcp-socket-accept sh -c 'exec > /dev/null cat'
  5. Bercot s6-tcpserver6s6-tcpserver4IPv4 的替代品)
    1. s6-tcpserver6 ::0 2003 fdredir --write 1 /dev/null cat
    2. s6-tcpserver6 ::0 2003 redirfd -w 1 /dev/null cat
    3. s6-tcpserver6 ::0 2003 sh -c 'exec > /dev/null cat'
  6. Bercot s6-网络工具(s6-tcpserver4IPv4 的替代品)
    1. s6-tcpserver6-socketbinder -B ::0 2003 s6-tcpserver6d fdredir --write 1 /dev/null cat
    2. s6-tcpserver6-socketbinder -B ::0 2003 s6-tcpserver6d redirfd -w 1 /dev/null cat
    3. s6-tcpserver6-socketbinder -B ::0 2003 s6-tcpserver6d sh -c 'exec > /dev/null cat'
  7. 帕普tcpsvd(不支持 IPv6)
    1. tcpsvd 0.0.0.0 2003 fdredir --write 1 /dev/null cat
    2. tcpsvd 0.0.0.0 2003 redirfd -w 1 /dev/null cat
    3. tcpsvd 0.0.0.0 2003 sh -c 'exec > /dev/null cat'
  8. Sampson onenetd(同时支持 IPv4 和 IPv6,但必须为每个运行单独的实例)
    1. onenetd -6 ::0 2003 fdredir --write 1 /dev/null cat
    2. onenetd -6 ::0 2003 redirfd -w 1 /dev/null cat
    3. onenetd -6 ::0 2003 sh -c 'exec > /dev/null cat'

享受替代

十六进制转储 -C 1>&2
或(无sh

fdmove -c 1 2 十六进制转储 -C
用于服务器程序,以便您获得正在测试的客户端程序正在执行的操作的本地日志。 ☺

进一步阅读

  • 协议:
  • 工具集:
    • 丹尼尔·J·伯恩斯坦。ucspi TCP协议。 cr.yp.to。
    • s6 网络。洛朗·贝尔科特. skarnet.org。
    • 执行。洛朗·贝尔科特. skarnet.org。
    • 乔纳森·德博因·波拉德 (2019)。开胃菜 软件。
    • 乔纳森·德博因·波拉德 (2019)。DJBwares 软件。
    • ipsvd。格里特·帕普. smarden.org。
    • 奥内特。亚当·桑普森. offog.org。
  • 参考手册:
    • 丹尼尔·J·伯恩斯坦。tcpserver程序。 ucspi-tcp。
    • 埃尔文·霍夫曼。 tcpserverucspi-tcp6。 fehcom.de。
    • s6-tcpserver4。洛朗·贝尔科特. s6 网络。 skarnet.org。
    • s6-tcpserver6。洛朗·贝尔科特. s6 网络。 skarnet.org。
    • fdmove。洛朗·贝尔科特. 执行。 skarnet.org。
    • redirfd。洛朗·贝尔科特. 执行。 skarnet.org。
    • tcpsvdipsvd。格里特·帕普. smarden.org。
    • 乔纳森·德博因·波拉德 (2019)。tcpserverDJBwares。软件。
    • 乔纳森·德博因·波拉德 (2019)。fdredir小吃指南。软件。
    • 乔纳森·德博因·波拉德 (2019)。fdmove小吃指南。软件。
    • 乔纳森·德博因·波拉德 (2019)。tcp-socket-listen小吃指南。软件。
    • 乔纳森·德博因·波拉德 (2019)。tcp-socket-accept小吃指南。软件。
    • 乔纳森·德博因·波拉德 (2019)。tcpserver小吃指南。软件。

相关内容