먼저 스크립트를 작성한 다음 socat을 사용하여 Unix 도메인 소켓에서 읽습니다.

먼저 스크립트를 작성한 다음 socat을 사용하여 Unix 도메인 소켓에서 읽습니다.

나는 Unix 도메인 소켓을 수신하는 간단한 서버를 가지고 있습니다(만일의 경우 CentOS 시스템에서). "DATE" 명령을 소켓에 보내면 소켓은 환영 메시지를 쓴 다음 "2015년 4월 15일"을 씁니다. 다음 명령을 사용하여 이 작업을 수동으로 수행할 수 있습니다.

socat - UNIX-CONNECT:/tmp/server.sock

하지만 이제는 스크립트를 작성하고 싶습니다. echo의 출력을 파이프로 연결하여 소켓에 DATE 명령을 보낼 수 있지만 socat는 환영 메시지만 반환합니다. socat이 처음 두 줄만 반환하는지, 아니면 소켓을 닫기 전에 조용한 시간을 기다리는지, 아니면 무엇인지 잘 모르겠습니다. 예를 들어:

echo "DATE" | socat - UNIX-CONNECT:/tmp/server.sock

연결을 끊기 전에 socat이 전체 응답을 캡처하도록 하려면 어떻게 해야 합니까? -t 및 -T 매개변수를 사용하여 5초 동안 기다리게 했지만 효과가 없으며 socat이 즉시 반환됩니다.

답변1

존재하다:

echo "DATE" | socat - UNIX-CONNECT:/tmp/server.sock

echoecho\n다음 종료하여 파이프의 쓰기 끝을 닫습니다.

-이로 인해 주소의 읽기 측 에 eof가 나타납니다 . 그런 다음 socatUnix 도메인 소켓의 "보내기" 쪽을 닫고 0.5초 동안 다른 방향의 소켓에서 아무 것도 나오지 않는 즉시 종료합니다.

이 옵션을 사용하면 시간 초과를 0.5초 늘릴 수 있습니다 -t. 그래서:

echo DATE | socat -t 300 - UNIX-CONNECT:/tmp/server.sock

socat날짜 응답을 위해 5분을 기다리거나 서버가 연결의 전송 측을 닫습니다(둘 중 먼저 도래하는 기준).

echo클라이언트가 보낸 사람을 닫을 때 서버가 중단되면 서버가 연결을 끊을 때까지 클라이언트(파이프의 왼쪽 : )를 계속 실행할 수 있습니다 (응답을 보낸 후 즉시 연결을 닫는다고 가정). 다음과 같이 할 수 있습니다.

sh -c 'echo "$$"; echo DATA; exec sleep infinity' | {
  IFS= read -r pid
  socat -t0 - UNIX-CONNECT:/tmp/server.sock
  kill -s PIPE "$pid" # terminate the client after the server shuts down
}

또는:

echo DATE | socat -t0 -,ignoreeof UNIX-CONNECT:/tmp/server.sock

(사용할 때 eof를 무시 ignoreeof하고 socat초당 더 많은 내용을 읽으려고 계속 시도합니다. 파이프를 사용하면 eof 다음에 아무것도 나오지 않지만 여전히 우리가 원하는 것을 제공합니다: 아직 살아있는 클라이언트를 에뮬레이션합니다.)

또는 답변을 본 후 즉시 종료합니다.

sh -c 'echo "$$"; echo DATA; exec sleep infinity' | {
  IFS= read -r pid
  socat -t0 - UNIX-CONNECT:/tmp/server.sock | {
    IFS= read -r welcome
    IFS= read -r date
    printf '%s\n' "$date"
  }
  kill -s PIPE "$pid" # terminate the client after the reply has been read
}

관련 정보