如何通过 TCP(类似于 netcat/socat)发送文字字符串,但由命令参数提供?

如何通过 TCP(类似于 netcat/socat)发送文字字符串,但由命令参数提供?

如果我想在 shell 环境中通过 TCP 发送字符串,我可以这样做:

echo text | nc 1.2.3.4 9876

凉爽的。交互地,这有效。现在我想通过从另一个程序生成子进程来以编程方式执行此操作,因此我想避免使用 shell 和管道。

另外,由于我正在部署无发行版 Docker 容器,它们没有外壳。

是否有现有工具可以通过 TCP 以字符串形式发送命令参数?我正在寻找 的(想象的)变体nc,例如:

nc 1.2.3.4 9876 text

其作用与

echo text | nc 1.2.3.4 9876

(也需要输出。)

我即将为此编写自己的应用程序,但我可以想象它已经存在,只需采用 argv 之一而不是 stdin 来传递。

查看了socat,它可以从文件中读取OPEN,这与我想要的非常接近,但我需要将字符串作为发出的命令的参数传递。

对于完整的上下文,Docker 容器的入口点应该可以由它设置,不需要 shell 或其他解释语言,而是像 glibc 这样的纯操作系统本机依赖项(就像 socat/nc 一样!)。

答案1

我不知道有任何程序接受参数并通过 tcp 连接发送它。

然而,您在评论中已经回答了您自己的问题,特别是以下行。

ENTRYPOINT ["/bin/sh", "-c", "mycommand"]

我很高兴您似乎希望在图像中应用程序占用空间最小,但我相信最好的解决方案是使用 and shell . netcat,然后使用原始命令。好吧,至少测试一下你想做的事情。

如果最终您想退回到只有一个可执行文件,则必须编写自己的程序来完成此操作。

一个想法,我明白了这个例子,显示了运行脚本的 Python 设置,

FROM python:2.7-slim AS build-env
ADD . /app
WORKDIR /app

FROM gcr.io/distroless/python2.7
COPY --from=build-env /app /app
WORKDIR /app
CMD ["hello.py", "/etc"]

这可能比开发一个C程序来完成这一切更容易/更快,但实际上你正在使用Python作为。最后,如果您认为socat可以执行您想要的操作,您可以使用socat从文件(您包含在图像中)中读取内容,并且该文件包含您的文字字符串。

答案2

我想你可以使用newlisp,例如

newlisp -e '(write-line (net-connect "localhost" 3456) "go for it")'

并根据需要改变参数。

我很确定您perl也可以使用 或其他解释器,尽管newlisp它很小并且也可以编译成静态程序。

上面的例子将使程序连接到localhost端口,并在套接字上3456发出线路,然后它将退出。go for it转到newlisp 主页更多细节。

答案3

我编写了自己的小应用程序来实现我需要的功能。读取参数并将它们写入套接字。遗憾的是它还不存在,但只有更复杂的功能可以在nc和等工具中使用socat。也许我可能会抽出时间编写一个补丁来nc接受来自参数的输入。

回复评论 - 我发现读到包含完整的 shell 并从中生成子进程是新的规范,这有点令人难过。我们不需要纯粹的开销。

相关内容