UCSPI-TCP 방식

UCSPI-TCP 방식

특정 포트(아마도 netcat을 사용하고 있을까요?)에서 수신 대기하도록 쉘 스크립트를 얻는 방법이 궁금합니다. 메시지가 해당 포트로 전송되면 스크립트가 메시지를 기록한 다음 함수를 실행하기를 바랍니다.

예:

  1. 컴퓨터 1은 백그라운드에서 스크립트를 실행하여 들어오는 트래픽에 포트 1234를 엽니다.

  2. 컴퓨터 2는 컴퓨터 1의 포트 1234에 "hello world" 메시지를 보냅니다.

  3. 컴퓨터 1의 스크립트는 "hello world" 메시지를 $MESSAGE 변수에 기록합니다.

  4. 이제 $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}"
    기능
완벽한

TCPREMOTEIPTCPREMOTEPORTUCSPI-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은 tcpserverIPv4와 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-tcpserver6service

#!/명령/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-listenTCP 소켓을 수신하고 운영 체제에서 지원하는 경우 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-listennosh 참조), 쉘 스크립트를 사용하여 실제 서비스 프로그램을 구축하는 것은 쉘에 내장된 기능 때문에 까다롭습니다. 함수 이 방법은 지원되지 않습니다. 표준입력이 1일 때 잘 대처할 수 있어야 한다.데이터그램소켓.

추가 읽기

답변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

관련 정보