socat et al: 들어오는 연결이 수신되면 명령을 실행합니다.

socat et al: 들어오는 연결이 수신되면 명령을 실행합니다.

누군가가 socat을 사용하여 다음과 같이 tcp 포트에서 들어오는 연결을 수신한다고 가정합니다.

$ socat file:`tty`,echo=1 "TCP-L:8080"

연결이 수신되면 명령을 한 번만 실행할 수 있습니까? notify-send알림을 받기 위해 실행하려고 하지만 어떤 명령이든 가능합니다 .

답변1

대신 명령을 실행하려면 exec또는 를 사용하십시오 .systemfile

socat -U tcp-listen:8000,reuseaddr,fork exec:date

이는 date명령을 실행하고 두 번째 주소에서 첫 번째 주소(또는 IOW)로의 양방향 스트림을 사용하여 각 연결의 클라이언트에 출력을 보냅니다. U그 출력은 date소켓으로 전송되지만 소켓의 데이터는 전송되지 않습니다. 전송 date).

또는 notify-send클라이언트에 메시지를 실행하고 보내 려면 systemget shell을 사용하십시오.

socat -U tcp-listen:8000,reuseaddr,fork 'system:{
  if
    notify-send "Got connection from $SOCAT_PEERADDR:$SOCAT_PEERPORT"
  then
    # sending to the client
    echo OK: notification sent successfully
  else
    echo ERROR: could not send notification
  fi
}'

같은 문자나 그 안에 있는 문자를 처리하지 못하게 함으로써 {...}일종의 따옴표로 해석되지만 단지 명령 그룹으로 처리되는 곳을 통해 전달되는 경우도 있습니다.socat,"sh

오류( sh또는 오류가 있는 notify-send경우 echo)는 클라이언트가 아닌 stderr로 전송되지만 socat옵션을 전달하여 변경할 수 있습니다 stderr.

socat -U tcp-listen:8000,reuseaddr,fork 'system:{
  if
    notify-send "Got connection from $SOCAT_PEERADDR:$SOCAT_PEERPORT"
  then
    # sending to the client
    echo OK: notification sent successfully
  else
    echo ERROR: could not send notification
  fi
},stderr'

답변2

나는 socat에 익숙하지 않지만 nc는 익숙하지 않습니다 ...

while true; do $CMD | nc -l 8080; done

(표준 출력이 클라이언트에 반환됩니다.)

OTOH, xinetd 또는 systemd-socket-activate를 사용할 수 있습니다

관련 정보