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

-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

почему отрицательные? опция -N решает эту проблему
camelccc

-1

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

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

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

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

(cat tsmmessage.bin; sleep 5) | nc -u localhost 4300

netcatвсе еще не закрывается, когда sleepзаканчивается. Я ожидаю, что первая командная строка вернется к приглашению через 1 секунду, но это не так.
Фрэнк Кастерс

как насчет добавления -q 1? то есть (echo INFO; sleep 1) | nc -q 1 redis.service.consul 6379?
SkyWriter

Со -qвсем работает, даже пример в моем оригинальном вопросе. С тех пор я перешел на более новую версию Ubuntu, возможно, в этом и заключается разница.
Фрэнк Кастерс

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