OS X LoginHook - NC가 뚜렷한 이유 없이 조기 종료됩니다.

OS X LoginHook - NC가 뚜렷한 이유 없이 조기 종료됩니다.

나는 사용하려고로그인훅많은 양의 데이터를 다운로드하는데 문제가 있어 뚜렷한 이유 없이 조기 종료되는 문제가 발생했습니다. 다음은 단순화된 테스트 스크립트입니다.

#!/bin/bash exec > /tmp/lhook.out.txt 2> /tmp/lhook.err.txt nc -v server 4444 > /tmp/nc-test echo "Exit value: $?"

서버에서 와 같은 간단한 nc 리스너를 실행하면 echo "Hello world. | nc -l 4444전송이 올바르게 작동합니다. 그러나 와 같은 더 큰 파일을 전송하려는 경우 nc -l 4444 < /path/to/some/large.file클라이언트는 작은 부분(때로는 2kiB, 때로는 ~250kiB)만 전송합니다. 보고된 종료 값은 0입니다.

아, 물론입니다. 사용자 세션 내 Terminal.app에서 실행되는 동일한 스크립트가 제대로 작동합니다.

누군가 디버깅을 도와주거나, 진행 상황을 설명하거나, 솔루션을 제공할 수 있나요?

편집하다: 나는 dtrussnetcat의 syscall을 엿본 적이 있으며 이것이 내가 얻은 것입니다:

  157/0x4c6:  write(0x1, "j,\350\037\376\377\377\203\304$f\211F\016\350&f\004\0", 0x400)                 = 1024 0
  157/0x4c6:  select(0x5, 0x7FFF53A87B40, 0x0, 0x0, 0x0)                 = 1 0
  157/0x4c6:  read(0x4, "\001u\374)u\f\215\f6\203\304\020\003\331\001\b\353\035\017\267\003\213\027P\213\317\377R\004\271\377\377\0", 0x400)    
         = 1024 0
  157/0x4c6:  write(0x1, "\001u\374)u\f\215\f6\203\304\020\003\331\001\b\353\035\017\267\003\213\027P\213\317\377R\004\271\377\377\0", 0x400)   
         = 1024 0
  157/0x4c6:  select(0x5, 0x7FFF53A87B40, 0x0, 0x0, 0x0)                 = 1 0
  157/0x4c6:  read(0x4, "\0", 0x400)             = 0 0
  157/0x4c6:  shutdown(0x4, 0x0, 0x0)            = -1 Err#57
  157/0x4c6:  close(0x4)                 = 0 0
  157/0x4c6:  close(0x3)                 = 0 0
  157/0x4c6:  close(0x3)                 = -1 Err#9

어떤 이유로 커널이 더 많은 데이터를 기다리는 대신 nc EOF를 제공하는 것 같습니다.

답변1

정말 당황스러운 감독이군요... :-(

ncstdin에서 EOF를 읽으면 종료됩니다. 데이터를 수신하는 클라이언트는 비대화형 쉘에서 LoginHook 스크립트를 실행합니다. 이 스크립트는 nc의 stdin 설명자를 /dev/null. EOF를 읽자마자 종료됩니다.

해결 방법은 간단합니다. -d스위치를 수신측에 공급하는 것입니다. 이렇게 하면 netcat 버전(BSD 또는 Linux) 중 하나가 stdin을 읽지 못하게 되고 전송이 문제 없이 완료됩니다.

관련 정보