
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 dtruss
espiado 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... :-(
nc
se cierra al leer EOF desde stdin. El cliente que recibe los datos ejecuta el script LoginHook en un shell no interactivo, que dirige nc
el descriptor stdin de probablemente a /dev/null
. Tan pronto como lee EOF, se cierra.
La solución es trivial: suministrar -d
el 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.