OS X LoginHook - nc wird ohne ersichtlichen Grund vorzeitig beendet

OS X LoginHook - nc wird ohne ersichtlichen Grund vorzeitig beendet

Ich versuche zu verwendenAnmeldehookgroße Datenmengen herunterzuladen und ich hatte Probleme, die ich darauf zurückgeführt habe, dass nc ohne ersichtlichen Grund vorzeitig beendet wurde. Dies ist ein vereinfachtes Testskript:

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

Wenn ich auf dem Server einen einfachen NC-Listener wie ausführe echo "Hello world. | nc -l 4444, funktioniert die Übertragung korrekt. Wenn ich jedoch eine größere Datei wie übertragen möchte, nc -l 4444 < /path/to/some/large.fileüberträgt der Client nur einen kleinen Teil (manchmal 2 KiB, manchmal ~250 KiB). Der gemeldete Exit-Wert ist 0.

Oh, und natürlich funktioniert dasselbe Skript einwandfrei, wenn es in einer Terminal.app innerhalb einer Benutzersitzung ausgeführt wird.

Kann jemand beim Debuggen helfen, erklären, was los ist, oder eine Lösung anbieten?

BEARBEITEN: Ich habe dtrussdie Systemaufrufe von Netcat ausspioniert und das hier ist dabei herausgekommen:

  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

Ich vermute, dass der Kernel aus irgendeinem Grund nc EOF ausgibt, anstatt auf weitere Daten zu warten.

Antwort1

Was für ein peinliches Versehen... :-(

ncwird beendet, wenn EOF von stdin gelesen wird. Der Client, der die Daten empfängt, führt das LoginHook-Skript in einer nicht interaktiven Shell aus, die ncden stdin-Deskriptor von wahrscheinlich an weiterleitet /dev/null. Sobald es EOF daraus liest, wird es beendet.

Die Lösung ist trivial: Geben Sie -dder Empfangsseite einen Switch. Dadurch wird verhindert, dass eine der Netcat-Versionen (BSD oder Linux) die Standardeingabe liest, und die Übertragung wird ohne Probleme abgeschlossen.

verwandte Informationen