쉘 환경에서 TCP를 통해 문자열을 보내려면 다음과 같이 할 수 있습니다.
echo text | nc 1.2.3.4 9876
시원한. 대화형으로는 작동합니다. 이제 다른 프로그램에서 하위 프로세스를 생성하여 프로그래밍 방식으로 이 작업을 수행하려고 하므로 셸과 파이프를 사용하지 않으려고 합니다.
또한 배포 중이기 때문에Distro가 없는 Docker 컨테이너, 껍질이 없습니다.
TCP를 통해 명령 매개변수를 문자열로 보낼 수 있는 기존 도구가 있습니까? 내가 찾고 있는 (가상의) 변형입니다 nc
. 예:
nc 1.2.3.4 9876 text
그 기능은 다음과 같습니다
echo text | nc 1.2.3.4 9876
(출력도 필요합니다.)
나는 이것에 대한 내 자신의 응용 프로그램을 작성하려고 하지만 그것이 이미 존재하고 stdin 대신 argv 중 하나에 전달되는 것을 상상할 수 있습니다.
이를 보면 socat
파일에서 읽을 수 있는데 OPEN
, 이는 내가 원하는 것과 매우 유사하지만 실행하는 명령에 대한 인수로 문자열을 전달해야 합니다.
전체 컨텍스트의 경우 Docker 컨테이너의 진입점은 셸이나 기타 해석된 언어 없이 glibc(socat/nc와 유사!)와 같은 순수 OS 기본 종속성을 사용하여 설정 가능해야 합니다.
답변1
매개변수를 받아들이고 이를 TCP 연결을 통해 전송하는 프로그램을 모릅니다.
그러나 귀하는 의견, 특히 다음 줄에서 귀하의 질문에 답변했습니다.
ENTRYPOINT ["/bin/sh", "-c", "mycommand"]
이미지에서 최소한의 응용 프로그램 공간을 원하는 것 같아 기쁘지만 가장 좋은 해결책은 및 원래 명령을 사용하는 것 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
이동뉴리스프 홈페이지자세한 내용은.
답변3
나는 필요한 기능을 구현하기 위해 작은 앱을 직접 작성했습니다. 매개변수를 읽고 소켓에 씁니다. 안타깝게도 아직 존재하지 않지만 nc
및 같은 도구 에서는 더 복잡한 기능만 사용할 수 있습니다 socat
. 어쩌면 매개변수의 입력을 받아들이는 패치를 작성하게 될 수도 있습니다 nc
.
댓글에 답하기 - 완전한 셸을 포함하고 여기에서 하위 프로세스를 생성하는 것이 새로운 표준이라는 점을 읽은 것은 약간 슬픈 일입니다. 순수한 오버헤드는 필요하지 않습니다.