OS X LoginHook - nc выходит преждевременно без видимой причины


0

Я пытаюсь использовать 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клиент передает только небольшую часть (иногда 2 кБ, иногда ~ 250 кБ). Значение выхода сообщается 0.

Да, и, конечно, тот же сценарий, выполняемый в Terminal.app внутри пользовательской сессии, работает нормально.

Может ли кто-нибудь помочь с отладкой, объяснить, что происходит, или предложить решение?

РЕДАКТИРОВАТЬ : у меня было dtruss отслеживание системных вызовов netcat, и вот что я получил:

  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 вместо ожидания большего количества данных.

Ответы:


0

Что за неловкий недосмотр ... :-(

nc выходит при чтении EOF со стандартного ввода. Клиент, который получает данные, запускает скрипт LoginHook в неинтерактивной оболочке, которая направляет nc дескриптор стандартного ввода /dev/null, Как только он читает EOF, он выходит.

Исправление тривиально: поставка -d переключиться на приемную сторону. Это предотвращает чтение stdin любой из версий netcat (BSD или Linux), и трансферер завершается без проблем.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.