nc는 OS X에서 서버 연결이 끊어질 때까지 기다리지 않습니다.

nc는 OS X에서 서버 연결이 끊어질 때까지 기다리지 않습니다.

ncOS X Mavericks에서 클라이언트가 소켓을 열어두고 서버가 소켓 연결을 끊을 때까지 데이터를 읽도록 만드는 방법은 무엇입니까 ?

데이터를 서버로 보낸 nc다음 응답을 사용하여 이 작업을 수행하고 싶습니다. 문제는 nc서버의 응답을 기다리지 않고 데이터를 보낸 후 소켓 연결을 끊는 것입니다.

그러면 데이터가 기록되고 종료됩니다.

$ echo "my instruction here" | nc 127.0.0.1 $MY_PORT

이렇게 하면 데이터를 쓴 다음 서버 연결이 끊어져도 종료되지 않습니다.

$ cat <(echo "my instruction here") - | nc 127.0.0.1 $MY_PORT

OS X Mavericks의 매뉴얼 페이지에는 요청을 보내고 응답을 인쇄하는 nc다음 HTTP GET예제가 있지만 작동하지 않습니다. 단지 요청을 보내고 서버의 응답을 기다리지 않고 종료됩니다. 매뉴얼 페이지 정보가 잘못된 것 같습니까?

$ echo -n "GET / HTTP/1.0\r\n\r\n" | nc host.example.com 80

답변1

nc의 기본 동작은 stdin이 닫힐 때 연결을 닫는 것입니다. 변경하려면 Linux에서 -q 옵션(예 -q -1: )을 사용할 수 있으며, OS X에서는 아마도 동일할 것입니다. 자세한 내용은 매뉴얼 페이지를 참조하십시오.

편집: OS X nc는 -q 스위치나 이와 유사한 것을 지원하지 않는 것 같습니다. 이 경우 다음을 수행하여 stdin이 닫히지 않도록 해야 합니다.

(에코 "foo", 수면 100000) |

답변2

청취 nc(서버)가 닫히면 클라이언트 nc도 종료됩니다.

Mac OS X에서는 open -a 'Activity Monitor'이를 확인할 수 있습니다.

예제는 중단 nc & cat되지 않고 nc읽기 cat및 쓰기를 위해 stdin 및 stdout을 계속 열어 둡니다.

그러나 cat리스너가 닫힌 후 파이프에 쓰려고 하면 오류가 발생하고 종료됩니다.ncSIGPIPEcat

# cat & SIGPIPE test
(sleep 1; echo hi) | 
   (trap 'echo "received signal $(($? - 128))" 1>&2' EXIT; cat) | :

kill -l 13
man bash | less -p 'EXIT STATUS'
man bash | less -Ip '128\+n'

Niklas Berglund의 해결 방법에 대한 대안으로 nc일시 중단된 명령을 포함하여 전체 프로세스 그룹을 종료하기 위해 클라이언트 종료를 캡처하는 것이 가능합니다 cat.

# console 1
# ctrl-c will "kill 0" entire process group sh -c '...'
nc -l 8080  

# console 2
# script command (FreeBSD version) will implicitly run: man 2 setsid
# kill 0 will therefore only kill the entire process group sh -c '...' 
# run in a script kill 0 would otherwise kill the entire script
# cf. also https://github.com/jerrykuch/ersatz-setsid 
script -q /dev/null sh -c '
(echo "my instruction here"; cat) | (trap "kill 0" EXIT; nc 127.0.0.1 8080)
'

답변3

해결 방법은 소켓에 계속 쓰는 것입니다. nc더 이상 데이터를 쓸 수 없으면 종료합니다.

(echo -ne "GET / HTTP/1.0\r\n\r\n"; (while true; do echo -e "\n"; sleep 1; done)) | nc example.com 80

ncnc소켓에 쓸 수 없어 종료될 때까지 매초마다 빈 줄을 보냅니다 nc.

이 솔루션을 안내해 준 Steffen Ullrich의 답변과 의견에 감사드립니다.

관련 정보