如果我想在 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 并从中生成子进程是新的规范,这有点令人难过。我们不需要纯粹的开销。