특정 포트(아마도 netcat을 사용하고 있을까요?)에서 수신 대기하도록 쉘 스크립트를 얻는 방법이 궁금합니다. 메시지가 해당 포트로 전송되면 스크립트가 메시지를 기록한 다음 함수를 실행하기를 바랍니다.
예:
컴퓨터 1은 백그라운드에서 스크립트를 실행하여 들어오는 트래픽에 포트 1234를 엽니다.
컴퓨터 2는 컴퓨터 1의 포트 1234에 "hello world" 메시지를 보냅니다.
컴퓨터 1의 스크립트는 "hello world" 메시지를 $MESSAGE 변수에 기록합니다.
이제 $MESSAGE 변수가 설정되었으므로 스크립트는 함수를 실행합니다.
어떻게 해야 하나요?
답변1
작동해야 합니다 socat
.
표준 입력을 통해 메시지를 받으려면 "getmsg.sh"와 같은 스크립트를 작성하세요.
#!/bin/bash
read MESSAGE
echo "PID: $$"
echo "$MESSAGE"
그런 다음 이 socat
명령을 실행하여 포트 7777의 모든 TCP 연결에 대해 스크립트를 호출합니다.
socat -u tcp-l:7777,fork system:./getmsg.sh
다른 셸에서 테스트 메시지를 보냅니다.
echo "message 1" | netcat localhost 7777
답변2
UCSPI-TCP 방식
netcat 외에 다른 도구 세트도 있습니다. 그 중 일부를 사용하는 방법은 다음과 같습니다. 그들은 모두 service
당신을 실행하는 스크립트 가 있다고 가정합니다 func
.
#!/bin/sh -r 읽을 때 메시지 하다 echo 1>&2 "${TCPREMOTEIP}" "${TCPREMOTEPORT}" rx "${MESSAGE}" 기능 완벽한
TCPREMOTEIP
TCPREMOTEPORT
UCSPI-TCP 프로토콜에 의해 정의된 환경 변수 .
스크립트는 다양한 도구 세트를 사용하여 각 TCP 연결에 대한 별도의 프로세스로 생성됩니다. 다음으로 이러한 도구는 짧은 스크립트에서 사용됩니다. 이러한 스크립트는 종종 실행 파일이라고 불리며 run
, daemontools 서비스 관리자 제품군에서 이를 실행하는 방법입니다. 물론 직접 호출할 수도 있습니다.
Bernsteinucspi-tcp
Daniel J. Bernstein의 ucspi-tcp를 사용하여 스크립트를 tcpserver
생성합니다 .service
#!/bin/sh -e tcpserver -v -P -R -H -l 0 0.0.0.0 7777 ./service 실행
Bernstein ucspi-tcp에는 IPv6를 지원하는 향상된 버전이 있습니다. Erwin Hoffman은 tcpserver
IPv4와 IPv6를 하나로 결합하려고 시도했으며(운영 체제에서 지원하는 경우 일부 운영 체제에서는 지원하지 않음) 다음 스크립트를 생성했습니다 service
.
#!/bin/sh -e tcpserver -v -P -R -H -l 0 ::0 7777 ./service를 실행합니다.
Bercot s6 - 네트워크, s6 및 execline
Laurent Bercot의 s6 네트워크를 사용하여 IPv4 및 IPv6를 각각 s6-tcpserver4
처리 하고 스크립트를 생성하십시오.s6-tcpserver6
service
#!/명령/execlineb s6-tcpserver4 -v 0.0.0.0 7777 . /제공하다
#!/명령/execlineb s6-tcpserver6 -v ::0 7777 . /제공하다
및 와 같은 도구를 삽입하면 s6-tcpserver-access
더 복잡한 서버를 구축 할 수 있습니다.s6-applyuidgid
./service
nosh UCSPI 도구
nosh 도구 세트를 사용하여 tcp-socket-listen
TCP 소켓을 수신하고 운영 체제에서 지원하는 경우 IPv4와 IPv6를 모두 다시 처리하고 tcp-socket-accept
순서대로 스크립트를 생성합니다 service
.
#!/빈/노쉬 tcp-socket-listen --combine4and6::7777 tcp-socket-accept --verbose --localname 0 . /제공하다
또는 OpenBSD와 같은 운영 체제에서 두 개의 별도 프로세스를 실행하십시오.
#!/빈/노쉬 TCP 소켓 수신 0.0.0.0 7777 tcp-socket-accept --verbose --localname 0 . /제공하다
#!/빈/노쉬 tcp-소켓-리스닝::7777 tcp-socket-accept --verbose --localname :: . /제공하다
및 와 같은 도구를 삽입하면 ucspi-socket-rules-check
더 복잡한 서버를 구축 할 수 있습니다.setuidgid
#!/빈/노쉬 tcp-socket-listen --combine4and6::7777 setuidgid 권한이 없는 사용자 tcp-socket-accept --verbose --localname 0 ucspi 소켓 규칙 확인 --verbose . /제공하다
Pap ipsvd
Gerrit Pape의 ipsvd를 사용하여 스크립트를 tcpsvd
생성합니다 .service
#!/bin/sh -e tcpsvd -v 0.0.0.0 7777 ./service 실행
UCSPI-UDP
service
표준 입력이 1인 경우 범용 스크립트를 처리할 수 있습니다.개울소켓. 그러나 TCP를 명시적으로 지정하지 않았습니다.
이전에 언급한 툴킷 중 일부는 TCP 서버를 구축하는 데 사용되는 것과 유사한 방식으로 UDP 서버를 구축하는 데 사용할 수 있지만( udp-socket-listen
nosh 참조), 쉘 스크립트를 사용하여 실제 서비스 프로그램을 구축하는 것은 쉘에 내장된 기능 때문에 까다롭습니다. 함수 이 방법은 지원되지 않습니다. 표준입력이 1일 때 잘 대처할 수 있어야 한다.데이터그램소켓.
추가 읽기
- 규약:
- 조나단 데보인 폴라드(2016).UNIX 클라이언트-서버 프로그래밍 인터페이스의 gen. 자주 주어지는 답변입니다.
- 번스타인, 다니엘(1996).UNIX 클라이언트-서버 프로그램 인터페이스. cr.yp.to.
- 도구 세트:
- 다니엘 J. 번스타인.ucspi TCP 프로토콜. cr.yp.to.
- s6 네트워크. Laurent Bercot.skarnet.org.
- s6. Laurent Bercot.skarnet.org.
- 조나단 데보인 폴라드(2016).간식. 소프트웨어.
- ipsvd. Gerrit Papp.smarden.org.
- 참고 도서:
- 다니엘 J. 번스타인.프로그램
tcpserver
. ucspi-tcp. - 어빈 호프만.
tcpserver
. ucspi-tcp6. fehcom.de. s6-tcpserver4
. 로랑 베르코. s6 네트워크. skarnet.org.s6-tcpserver6
. 로랑 베르코. s6 네트워크. skarnet.org.s6-tcpserver-access
. 로랑 베르코. s6 네트워크. skarnet.org.s6-applyuidgid
. 로랑 베르코. s6. skarnet.org.- 조나단 데보인 폴라드(2016).
tcpserver
. 스낵 가이드. 소프트웨어. - 조나단 데보인 폴라드(2016).
tcp-socket-listen
. 스낵 가이드. 소프트웨어. - 조나단 데보인 폴라드(2016).
tcp-socket-accept
. 스낵 가이드. 소프트웨어. - 조나단 데보인 폴라드(2016).
ucspi-socket-rules-check
. 스낵 가이드. 소프트웨어. - 조나단 데보인 폴라드(2016).
setuidgid
. 스낵 가이드. 소프트웨어. - 조나단 데보인 폴라드(2016).
udp-socket-listen
. 스낵 가이드. 소프트웨어. tcpsvd
. ipsvd. Gerrit Papp.smarden.org.
- 다니엘 J. 번스타인.프로그램
답변3
udpsvd
이는 Ubuntu/Debian에서 사용 가능한 도구를 통해서도 수행할 수 있습니다(맨페이지 보기) 및 busybox에 내장되어 있습니다. 예:
# simple UDP "echo" on port 9998
udpsvd 0.0.0.0 9998 cat
cat
실행할 쉘 스크립트로 바꾸고 stdin을 패킷으로 바꿉니다.
를 사용하면 netcat
루프에서 실행하여 계속 수신하고 각 패킷을 다음으로 전달할 수 있습니다 myscript
.
while true; do nc -ul 9998 | myscript.sh; done
수신된 모든 패킷을 스크립트의 단일 호출에 스트림으로 전달하려면 다음을 수행하십시오.
# this will keep listening instead of terminating the process:
nc -kul 9998 |myscript.sh