저는 awk를 사용하고 있으며 TCP 소켓을 통해 노출하고 싶습니다.
처음에 시도했지만 micro inetd를 사용하면 실패했습니다. 캐리지 리턴/줄 바꿈을 처리하는 방식에 문제가 있을 수 있다고 생각하여 socat으로 전환해 보기로 결정했습니다.
socat을 통해 원격 명령을 사용하는 것은 매우 간단합니다.
socat TCP4-LISTEN:9000 EXEC:/bin/cat
socat TCP4-LISTEN:9000 SYSTEM:"/bin/python -i"
이 두 가지 직업
그러나 간단한 awk 명령(예: 수신된 라인 수를 단계별로 실행하기 위해 `awk '{print NR}'')을 사용하여 동일한 작업을 시도할 때 동일한 시스템의 다른 쉘에서 socat와 연결할 때 어떤 정보라도 얻으세요.
나는 많은 것을 시도했습니다 (일부는 구문 오류로 인해 실패했습니다. 나에게는 약간 모호합니다. 실제 명령 실행이 위임되기 때문에 strace socat을 시도하여 정확히 무엇이 실행되고 있는지 확인할 수도 없었습니다. 껍데기):
socat TCP4-LISTEN:9000 SYSTEM:"/usr/bin/awk '{print NR}'"
socat TCP4-LISTEN:9000 SYSTEM:'/usr/bin/awk "{print NR}"'
socat TCP4-LISTEN:9000 SYSTEM:'/usr/bin/awk "{print\ NR}"'
작은 스크립트도 만들었습니다./tmp/testawk
#! /bin/sh
/usr/bin/awk '{print NR}'
(exec 변형도 있습니다)
#! /bin/sh
exec /usr/bin/awk '{print NR}'
이 두 가지 모두 로컬에서 작동하지만 전화할 때
socat TCP4-LISTEN:9000 EXEC:/tmp/testawk
출력을 다시 보내지 않습니다.
문제가 stdin/stdout 핸들의 상속 및/또는 crlf 다시 처리일 수 있다고 생각합니다. 또한 다음을 시도했습니다.
socat TCP4-LISTEN:9000 EXEC:/tmp/testawk,nofork
socat TCP4-LISTEN:9000,crnl EXEC:/tmp/testawk
socat TCP4-LISTEN:9000 EXEC:/tmp/testawk,crnl
socat TCP4-LISTEN:9000,crnl EXEC:/tmp/testawk,crnl
아직도 불평하는 사람들이 있다는 것을 알았습니다유제, 그러나 분명히 그것은 어떤 관심도 끌지 못했습니다.
무슨 문제가 있는지 아시나요?
답변1
awk는 터미널을 가리킬 때 라인 버퍼링되고 그렇지 않을 때 완전히 버퍼링되는 stdout으로 인쇄하고 있습니다. 이는 버퍼가 채워진 후 출력을 받아야 함을 의미합니다. 즉, 4KB가 인쇄되었습니다.
많은 출력을 전송하여(예: yes 프로그램 사용) 이를 테스트할 수 있습니다. 수정하려면 다음을 수행해야 합니다. - awk의 표준 출력을 버퍼링 해제합니다(예:https://unix.stackexchange.com/a/25375/63847) - 발신자의 shutdown(2) 시스템 호출을 사용합니다(추악함).
더 나은 솔루션을 환영합니다
답변2
pty를 프로그램 socat
과 연관시키도록 지시할 수 있습니다 . 이렇게 하면 라인 버퍼 모드에서 강제로 실행되고 원하는 응답을 즉시 얻을 수 있습니다.awk
awk
다음은 포트 9000에서 수신 대기하는 명령줄입니다.
socat TCP4-LISTEN:9000 SYSTEM:'/tmp/awk.sh',pty,echo=0
스크립트의 내용은 다음과 같습니다 /tmp/awk.sh
.
#!/usr/bin/awk -f
#
BEGIN { print "This is the awk socket" }
{ print NR, $0 }
END { print "All done" }
실행 예시:
$ nc -vvv otherhost 9000
otherhost [192.168.1.15] 9000 (?) open
This is the awk socket
hello world
1 hello world
how are you
2 how are you
boo
3 boo
^C sent 28, rcvd 61