포트가 메시지를받을 때 스크립트가 실행되도록 설정하는 방법


12

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

예:

  1. 컴퓨터 1의 스크립트가 백그라운드에서 실행 중이고 스크립트가 들어오는 트래픽으로 포트 1234를 열었습니다.

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

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

  4. 변수 $ MESSAGE가 설정되었으므로 스크립트가 기능을 실행합니다.

이걸 어떻게하면 되나요?

답변:


12

로 가능해야합니다 socat.

stdin을 통해 하나의 메시지를 수신하도록 "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

테스트 했습니까?

다시 작성하고 지금 테스트;)
rudimeier

1
귀하의 솔루션에서 영감을 얻어 netcat과 작동하는 방법을 찾았습니다. nc -l 7777 | ./getmsg.sh
Daniel

다행 이네요 그러나 netcat하나의 연결 후에 존재합니다. socat내 명령 줄에서 ", fork"를 제거하면 동일한 작업을 수행합니다.
rudimeier

7

UCSPI-TCP 방식

netcat 이외의 툴셋이 있습니다. 다음은 그중 몇 가지를 사용하는 방법입니다. 그들은 모두 service당신 func이 무엇이든간에 당신을 실행 하는 스크립트가 있다고 가정합니다 :

#! / bin / sh
읽는 동안 -r MESSAGE
하다
    echo 1> & 2 "$ {TCPREMOTEIP}" "$ {TCPREMOTEPORT}"rx "$ {MESSAGE}"
    펑크
끝난

TCPREMOTEIPTCPREMOTEPORT환경 변수는 UCSPI-TCP 프로토콜에 의해 정의된다.

스크립트는 다양한 도구 세트를 사용하여 TCP 연결마다 개별 프로세스로 생성됩니다. 다음은 짧은 스크립트 내에서 사용 된 도구입니다. 종래라는 이름의 이러한 스크립트는 run, 하나는 데몬 툴즈 가족 서비스 관리자에서 실행할 것입니다 방법이다. 물론 직접 호출 할 수도 있습니다.

번스타인 ucspi-tcp

Daniel J. Bernstein의 ucspi-tcp를 사용 tcpserver하여 service스크립트를 생성합니다 .

#! / bin / sh -e
exec tcpserver -v -P -R -H -10 0.0.0.0 7777 ./ 서비스

Bernstein ucspi-tcp의 IPv6 가능 고급 버전이 있습니다. Erwin Hoffman tcpserver을 사용하면 IPv4와 IPv6을 하나로 처리하려고 시도하고 (운영 체제에서 지원하는 경우 일부는 지원하지 않음) service스크립트를 생성합니다 .

#! / bin / sh -e
exec tcpserver -v -P -R -H -l 0 :: 0 7777 ./ 서비스

Bercot s6-networking, s6 및 execline

Laurent Bercot의 s6-networking을 사용 s6-tcpserver4하여 s6-tcpserver6IPv4와 IPv6을 별도로 처리하고 service스크립트를 생성하십시오 .

#! / command / execlineb
s6-tcpserver4 -v 0.0.0.0 7777 
./서비스
#! / command / 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스크립트를 생성하는 체인을 다시 처리 합니다 .

#! / bin / nosh
tcp-socket-listen --combine4and6 :: 7777
tcp-socket-accept --verbose --localname 0
./서비스

또는 OpenBSD와 같은 운영 체제에서 두 개의 개별 프로세스를 실행합니다.

#! / bin / nosh
tcp- 소켓 청취 0.0.0.0 7777
tcp-socket-accept --verbose --localname 0
./서비스
#! / bin / nosh
tcp-socket-listen :: 7777
tcp-socket-accept --verbose --localname ::
./서비스

체인 ucspi-socket-rules-check과 같은 도구를 삽입하여보다 복잡한 서버를 구축 할 수 있습니다 setuidgid.

#! / bin / nosh
tcp-socket-listen --combine4and6 :: 7777
setuidgid 권한이없는 사용자
tcp-socket-accept --verbose --localname 0
ucspi-socket-rules-check --verbose
./서비스

페이 프 ipsvd

Gerrit Pape의 ipsvd로 스크립트를 tcpsvd생성합니다 service:

#! / bin / sh -e
exec tcpsvd -v 0.0.0.0 7777 ./ 서비스

UCSPI-UDP

service표준 입력이 스트림 소켓 인 경우 공통 스크립트가 처리 할 수 ​​있습니다 . 그러나 TCP를 명시 적으로 지정하지 않았습니다.

앞서 언급 한 툴킷 중 일부는 UDP 서버를 사용하여 TCP 서버를 빌드하는 방법과 유사한 방식으로 UDP 서버를 빌드하는 데 사용할 수 있지만 ( udp-socket-listen쉘의 내장은 그렇지 않으므로) 쉘 스크립트를 사용하여 실제 서비스 프로그램을 빌드하는 것은 까다 롭습니다. 표준 입력이 데이터 그램 소켓 일 때 반드시 잘 대처하십시오 .

추가 자료


0

이 작업 udpsvd은 Ubuntu / Debian ( 맨 페이지 참조 )과 busybox에 내장되어 있습니다. 예:

# simple UDP "echo" on port 9998
udpsvd 0.0.0.0 9998 cat

교체 cat실행하는 쉘 스크립트, 표준 입력 패킷입니다.

을 사용하면 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.