Socat

TCP偵聽器丟棄所有輸入?

  • April 11, 2019

我正在嘗試實現一個接受連接的 TCP 偵聽器,然後簡單地丟棄其所有輸入(它用於測試工具)。

現在,我正在使用socat - tcp-listen:2003,fork,reuseaddr,但這會將輸入列印到標準輸出。我不想要那個。

我無法將輸出重定向到/dev/null,因為我在alpine/socat docker 容器中執行此操作,並且它實際上並未使用 shell,因此重定向不起作用。

如果我嘗試使用socat /dev/null tcp-listen:2003,fork,reuseaddr,那麼任何連接都會立即斷開,大概是因為socat無法從/dev/null.

實現 TCP 偵聽器的最佳方式是什麼?

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

最佳是一個棘手的標準,但可以看出 Docker 與 Microsoft Excel 一樣必要。☺

我們已經知道一個 Unix 程序在 EOF 之前讀取它的輸入並有效地丟棄它:

貓 > /dev/null

把它變成一個 TCP 伺服器是一個非常簡單的練習。 這就是 UCSPI-TCP 的全部意義所在。 它採用使用標準 I/O 的程序並圍繞它們包裝一個簡單的框架,使它們成為 TCP 伺服器。可以用其他東西代替cat並更改服務協議,而不必擔心傳輸。可以類似地用 UCSPI-LOCAL 工具替換 UCSPI-TCP 工具,並更改傳輸,而無需對cat.

有幾個 UCSPI-TCP 工具集。Daniel J. Bernstein 寫了一篇。Laurent Bercot 寫了一篇。Gerrit Pape 寫了一篇。亞當桑普森寫了一篇。我寫了一個。此外,人們可以混合和匹配來自多個工具集的工具,這些東西是有意容易組合的。可以使用我的fdredir或 Laurent Bercot 的redirfd,甚至生成一個非互動式的sh. (前兩者的成本比成熟的 低sh,對於 nosh 工具fdredir甚至是內置的,因此它進一步避免了通過外部命令連結的成本。)

所以有幾種方法可以做到這一點:

  1. Bernstein tcpserver(原創或 djbwares;不支持 IPv6)

  2. tcpserver -R -H -l 0 0.0.0.0 2003 fdredir --write 1 /dev/null cat

  3. tcpserver -R -H -l 0 0.0.0.0 2003 redirfd -w 1 /dev/null cat

  4. tcpserver -R -H -l 0 0.0.0.0 2003 sh -c 'exec > /dev/null cat'

  5. Hoffman tcpserver(同時支持 IPv4 和 IPv6;對於需要關閉的 DNS 和 INFO 查找具有原始 Bernstein 預設值)

  6. tcpserver -R -H -l 0 ::0 2003 fdredir --write 1 /dev/null cat

  7. tcpserver -R -H -l 0 ::0 2003 redirfd -w 1 /dev/null cat

  8. tcpserver -R -H -l 0 ::0 2003 sh -c 'exec > /dev/null cat'

  9. 我的tcpserver墊片(同時支持 IPv4 和 IPv6,但必須為每個執行單獨的實例;具有更現代的預設值)

  10. tcpserver ::0 2003 fdredir --write 1 /dev/null cat

  11. tcpserver ::0 2003 redirfd -w 1 /dev/null cat

  12. tcpserver ::0 2003 sh -c 'exec > /dev/null cat'

  13. 我的 UCSPI-TCP 工具(在 Linux 和 FreeBSD 上同時使用 IPv4 和 IPv6)

  14. tcp-socket-listen --combine4and6 ::0 2003 tcp-socket-accept fdredir --write 1 /dev/null cat

  15. tcp-socket-listen --combine4and6 ::0 2003 tcp-socket-accept redirfd -w 1 /dev/null cat

  16. tcp-socket-listen --combine4and6 ::0 2003 tcp-socket-accept sh -c 'exec > /dev/null cat'

  17. Bercot s6-tcpserver6(替代s6-tcpserver4IPv4)

  18. s6-tcpserver6 ::0 2003 fdredir --write 1 /dev/null cat

  19. s6-tcpserver6 ::0 2003 redirfd -w 1 /dev/null cat

  20. s6-tcpserver6 ::0 2003 sh -c 'exec > /dev/null cat'

  21. Bercot s6 網路工具(替代s6-tcpserver4IPv4)

  22. s6-tcpserver6-socketbinder -B ::0 2003 s6-tcpserver6d fdredir --write 1 /dev/null cat

  23. s6-tcpserver6-socketbinder -B ::0 2003 s6-tcpserver6d redirfd -w 1 /dev/null cat

  24. s6-tcpserver6-socketbinder -B ::0 2003 s6-tcpserver6d sh -c 'exec > /dev/null cat'

  25. Pape tcpsvd(不支持 IPv6)

  26. tcpsvd 0.0.0.0 2003 fdredir --write 1 /dev/null cat

  27. tcpsvd 0.0.0.0 2003 redirfd -w 1 /dev/null cat

  28. tcpsvd 0.0.0.0 2003 sh -c 'exec > /dev/null cat'

  29. Sampson onenetd(同時支持 IPv4 和 IPv6,但必須為每個執行單獨的實例)

  30. onenetd -6 ::0 2003 fdredir --write 1 /dev/null cat

  31. onenetd -6 ::0 2003 redirfd -w 1 /dev/null cat

  32. onenetd -6 ::0 2003 sh -c 'exec > /dev/null cat'

享受替代品

十六進制轉儲 -C 1>&2

或(不帶sh

fdmove -c 1 2 十六進制轉儲 -C

用於伺服器程序,以便您獲得正在測試的客戶端程序正在執行的本地日誌。☺

進一步閱讀

  • 協議:

  • 工具集:

    • 丹尼爾·伯恩斯坦。ucspi-tcp . cr.yp.to.
    • s6-網路。勞倫特·伯科特。skarnet.org。
    • 執行線。勞倫特·伯科特。skarnet.org。
    • 喬納森·德博因·波拉德 (2019)。諾什 軟體。
    • 喬納森·德博因·波拉德 (2019)。djbwares 軟體。
    • ipsvd。格里特佩佩。銳化.org。
    • onenetd . 亞當桑普森。offog.org。
  • 參考手冊:

    • 丹尼爾·伯恩斯坦。tcpserver程序。ucspi-tcp。
    • 歐文霍夫曼。 tcpserver. ucspi-tcp6 . fehcom.de
    • s6-tcpserver4. 勞倫特·伯科特。 s6-網路。skarnet.org。
    • s6-tcpserver6. 勞倫特·伯科特。 s6-網路。skarnet.org。
    • fdmove. 勞倫特·伯科特。 執行線。skarnet.org。
    • redirfd. 勞倫特·伯科特。 執行線。skarnet.org。
    • tcpsvd. ipsvd。格里特佩佩。銳化.org。
    • 喬納森·德博因·波拉德 (2019)。tcpserver. djbwares。軟體。
    • 喬納森·德博因·波拉德 (2019)。fdredir. 小吃指南。軟體。
    • 喬納森·德博因·波拉德 (2019)。fdmove. 小吃指南。軟體。
    • 喬納森·德博因·波拉德 (2019)。tcp-socket-listen. 小吃指南。軟體。
    • 喬納森·德博因·波拉德 (2019)。tcp-socket-accept. 小吃指南。軟體。
    • 喬納森·德博因·波拉德 (2019)。tcpserver. 小吃指南。軟體。

引用自:https://unix.stackexchange.com/questions/511849