사용자 정의 bash 함수를 사용한 socat 양방향 통신

사용자 정의 bash 함수를 사용한 socat 양방향 통신

그래서 나는 socat이 지속적으로 연결을 듣고 처음 x 행을 얻고 메시지로 응답하기를 원합니다. 이상적으로는 사용자 정의 함수를 사용하여 해당 논리를 처리하고 싶지만 이를 달성할 방법을 찾을 수 없습니다.

내 시나리오:

client 1:

cat <(printf "line1\nline2\n") -|nc socat_server socat_port

client 2:

cat <(printf "line3\nline4\n") -|nc socat_server socat_port

내가 얻고 싶은 것: line1, line3 및 클라이언트 메시지(예: EXIT)

나는 이전에 시도했습니다:

exec {fd}> >(my_custom_function)
socat tcp-listen:10000,reuseaddr,fork system:"head -n1>&$fd;echo EXIT;exit"

하지만 "잘못된 FD 번호"가 표시됩니다. 이 문제를 해결할 방법이 있나요?

답변1

의 경우 {fd}> file값은 $fd9보다 커집니다.

이 쉘 코드를 해석하려면 system:shell-code, socat호출을 사용하십시오 .sh

sh구현에서는 리디렉션 연산자에서 9보다 높은 fd를 지원할 필요가 없습니다. 구현하거나 dash구현 mksh하지 않습니다. 또한 ksh93(이 구문을 지원하는 zsh 및 bash의 세 가지 셸 중 하나)은 exec {fd}> file획득한 fd에 close-on-exec 플래그를 표시하므로 거기에서 상속되지 않습니다 socat.

따라서 여기서는 10보다 낮은 fd를 사용해야 합니다.

exec 4> >(my_custom_function)
socat tcp-listen:10000,reuseaddr,fork system:"head -n1>&4;echo EXIT;exit"

또는 zsh와 같이 fds 9 이상을 지원하는 쉘을 호출하십시오.

exec {fd}> >(my_custom_function)
socat tcp-listen:10000,reuseaddr,fork "exec:'zsh -c \"head -n1>&$fd;echo EXIT;exit\"'"

(에서 아님 ksh93).

관련 정보