OS X LoginHook: nc se cierra prematuramente sin motivo aparente

OS X LoginHook: nc se cierra prematuramente sin motivo aparente

estoy tratando de usargancho de inicio de sesiónpara descargar grandes cantidades de datos y he tenido problemas que he determinado que no salí prematuramente sin razón aparente. Este es un script de prueba simplificado:

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

En el servidor, cuando ejecuto un escucha nc simple como echo "Hello world. | nc -l 4444, la transferencia funciona correctamente. Pero cuando quiero transferir un archivo más grande, como nc -l 4444 < /path/to/some/large.file, el cliente transfiere solo una pequeña parte (a veces 2 kiB, a veces ~250 kiB). El valor de salida informado es 0.

Ah, y por supuesto, el mismo script ejecutado en Terminal.app dentro de una sesión de usuario funciona bien.

¿Alguien puede ayudar con la depuración, explicar lo que está pasando o proporcionar una solución?

EDITAR: He dtrussespiado las llamadas al sistema de netcat y esto es lo que obtuve:

  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

Supongo que, por alguna razón, el kernel proporciona nc EOF en lugar de esperar más datos.

Respuesta1

Que descuido más vergonzoso... :-(

ncse cierra al leer EOF desde stdin. El cliente que recibe los datos ejecuta el script LoginHook en un shell no interactivo, que dirige ncel descriptor stdin de probablemente a /dev/null. Tan pronto como lee EOF, se cierra.

La solución es trivial: suministrar -del interruptor al lado receptor. Esto evita que cualquiera de las versiones de netcat (BSD o Linux) lea la entrada estándar y la transferencia se completa sin problemas.

información relacionada