Netcat не завершает работу при закрытии stdin

11

Я пытаюсь отправить сообщение через netcat. После отправки сообщения, netcatнеобходимо прекратить.

Я пробовал следующее:

cat tsmmessage.bin | nc -u localhost 4300
nc -u localhost 4300 < message.bin

В -qопции говорится:

-q секунд

после EOF на stdin, подождите указанное количество секунд и затем выйдите. Если секунды отрицательны, ждите вечно.

Но

nc -q0 -u localhost 4300 < message.bin

тоже не работает.

Что мне не хватает?

Фрэнк Кастерс
источник

Ответы:

6

Предполагая, что после отправки EOF соединение будет бездействовать, вы можете использовать -w timeoutопцию, которая работает, чтобы timeoutбыть равной нулю (в отличие от глупой -qопции ...)

cat tsmmessage.bin | nc -u localhost 4300 -w0
Бора М. Альпер
источник
1
Это правильный ответ и должен быть принят, а не -q.
ccpizza
1
нулевой тайм-аут не работает на моей машине (debian stretch). это говоритinvalid wait-time 0
Анубис
3

Без -qфлага ваш экземпляр netcatбудет ждать вечно. В UDP нет сообщения «конец потока», поэтому нет возможности netcatузнать, что и stdin, и сетевое соединение завершены.

Например, при использовании TCP / IP это работает как ожидалось:

nc -l localhost 4300                     # Window 1
nc localhost 4300 </etc/group            # Window 2

Но, как вы определили, использование UDP / IP никогда не заканчивается:

nc -u -l localhost 4300                  # Window 1
nc -u localhost 4300 </etc/group         # Window 2

Это где -qфлаг входит. Но, к сожалению, он не принимает значение 0. Это также не будет принимать нецелые значения. Вот лучшая альтернатива, которую я могу предложить, не прибегая к timeoutкакой-либо внешней утилите:

nc -u -l localhost 4300                  # Window 1
nc -q 1 -u localhost 4300 </etc/group    # Window 2

Даже здесь невозможно netcatизящно провести время прослушивания . (Параметр -wтайм-аута игнорируется и не -qимеет значения.) Нечто подобное может быть полезно в практической ситуации, так что его netcatубивают через 90 секунд:

timeout 90 nc -u -l localhost 4300       # Window 1
nc -q 1 -u localhost 4300 </etc/group    # Window 2
roaima
источник
-q 0работает для меня.
Алик Эльзин-килака
@ AlikElzin-kilaka у меня не работает. Вы определенно используете UDP в своих тестах? Какая у вас версия netcat? Вы, вероятно, на более свежей версии.
Ройма
0

УДП

# listen on receiver
nc -u -l localhost -p 4300

# sender
cat tsmmessage.bin | nc -u -N -q 0 localhost 4300

ТСР

# listen on receiver
nc -l localhost -p 4300

# sender
cat tsmmessage.bin | nc -N localhost 4300
krazedkrish
источник
почему отрицательные? опция -N решает эту проблему
camelccc
-1

Наткнулся на это, когда гуглил по поводу примерно такой же проблемы. Выяснилось, что проблема заключалась в том, что netcat был убит bash сразу после того, как все данные были засосаны, без какого-либо шанса получить ответ.

Моим решением было добавить задержку после передачи данных, например:

(echo INFO; sleep 1) | nc redis.service.consul 6379

С файлом это может выглядеть так:

(cat tsmmessage.bin; sleep 5) | nc -u localhost 4300
Skywriter
источник
netcatвсе еще не закрывается, когда sleepзаканчивается. Я ожидаю, что первая командная строка вернется к приглашению через 1 секунду, но это не так.
Фрэнк Кастерс
как насчет добавления -q 1? то есть (echo INFO; sleep 1) | nc -q 1 redis.service.consul 6379?
SkyWriter
Со -qвсем работает, даже пример в моем оригинальном вопросе. С тех пор я перешел на более новую версию Ubuntu, возможно, в этом и заключается разница.
Фрэнк Кастерс
Это странно. В любом случае, рад, что мы оба нашли способ обойти это :)
SkyWriter