socat는 연결된 각 클라이언트에 표준 입력을 복사합니다.

socat는 연결된 각 클라이언트에 표준 입력을 복사합니다.

ncat(nmap folk의)에는 모든 입력을 연결된 모든 클라이언트에 복사하는 깔끔한 기본 동작이 있습니다. 예를 들어:

터미널 1에서 서버를 시작합니다.

% mkfifo messages
% exec 8<>messages  # hold the fifo open
% ncat -l 5555 -k --send-only < messages

터미널 2와 3에서 클라이언트 수신 대기를 시작합니다.

% nc localhost 5555

터미널 4의 fifo에 무언가를 인쇄하고 연결된 모든 클라이언트(터미널 2 및 3)에 동일한 메시지가 나타나는지 확인하십시오.

% printf 'Hello, clients.\n' > messages

socat과 동일한 패턴을 채택하는 것이 가능합니까?

고쳐 쓰다:Philippe의 솔루션 스크린샷:

여기에 이미지 설명을 입력하세요.

답변1

당신이하고 싶은 일은 아마도 불가능할 것입니다. 가장 가까운 방법은 다음과 같습니다.

제1터미널:

mkfifo messages
socat PIPE:messages TCP4-LISTEN:5555,fork

터미널 2와 3에서:

nc localhost 5555

그때 보낸 문자는 messages2번 터미널에 나타날 때도 있고 3번 터미널에 나타날 때도 있다. 이는 localhost:5555 에서 열린 소켓을 통해 제공되기 전에 socat텍스트가 "소비"되기 때문입니다. 그런 다음 깨어나 소켓에서 메시지를 읽는 messages첫 번째 프로세스는 메시지를 받고 다른 프로세스는 아무것도 얻지 못합니다.netcat

답변2

이 명령은 다음을 수행합니다.

socat tcp-listen:5555,fork,reuseaddr \
'system:
PIPE=$(mktemp -u /tmp/pns_XXX)
mkfifo $PIPE
while read PIPE_MESSAGE<$PIPE; do
  echo $PIPE_MESSAGE
done &
PID=$!
while read CLIENT_MESSAGE; do
  for OTHER_PIPE in $(ls /tmp/pns_*); do
    [ $PIPE != $OTHER_PIPE ] && echo $CLIENT_MESSAGE > $OTHER_PIPE
  done
done
kill $PID
rm $PIPE'

아이디어는 각각의 새로운 연결에 대해 명명된 파이프를 생성한 다음 파이프에서 읽은 내용을 표준 출력(즉, 클라이언트에 전송)에 반영하는 것입니다. 표준 입력(즉, 클라이언트가 서버에 보낸 것)을 읽고 자체 파이프를 제외한 모든 명명된 파이프에 수신된 모든 내용을 에코합니다.

관련 정보