나는 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
echo
쓴 echo\n
다음 종료하여 파이프의 쓰기 끝을 닫습니다.
-
이로 인해 주소의 읽기 측 에 eof가 나타납니다 . 그런 다음 socat
Unix 도메인 소켓의 "보내기" 쪽을 닫고 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
}